At Wed, 13 Mar 2002 16:23:02 +0900,
井上 浩一 wrote:
> これは状況自爆でなくて、時限自爆。timeoutを使えば良いかもしれません
> が、スクリプトのレベルでなく Ruby本体レベルで行うことで、ソースが汚
> れず強力である。

こんな(↓)程度でも一応の実装はできますね。主たる処理とは分離できると思
いますので、ソースが汚れることはないんじゃないかと。それに強制終了と言っ
ても、終了時の後処理や"まだ終わっちゃいけない"状況もあるかも知れないの
で、スクリプトで記述できることはスクリプトでやる方が良さそうな気がしま
す。

Thread.new do
  sleep 20
  puts "Timeout."
  exit
end

puts "Start."
loop do
  puts "*"
  sleep 1
end

> loop{
>   print "A"
> }

> def a()
>   b()
> end
> 
> def b()
>   a()
> end

> 実行後に分かる複雑なものもあるかもしれませんのでRubyに持ってもらった
> 方が話が早いと思いました。

なるほど。ただそれだとRubyに頼り過ぎのような印象を受けます。C++のソー
スコードを書いてそれをコンパイルできたとしても、エラーがないという意味
ではありませんよね。上記のような例をRuby自身に検出してもらうとしても、
さらに複雑(微妙?)で検出しきれない状況がありえないでしょうか?

> すべでこれらはデバックモードの話で、オプション指定なので通常モード時
> には困らないと思います。

開発時のことという前提であれば、rubyunitなどで徹底的に試験する方が有用
だと思います。GUIが絡むと試験しにくいんですが、MVCで入出力と処理を分離
させれば処理についてはrubyunitを適用できますので、無限反復や相互呼び出
しは試験で検出できるはずです。もちろん、それなりのテストケースを作る必
要はありますけどね。

ということで、その種の検査などを行うのであれば、Ruby本体じゃなくて検査
ツールとして別に用意する方がいいな、という意見です。いかがでしょう?

///// ------------------------------------------------------------------
-O-O-    斉藤 秀格 (SAITO Shukaku) @ PUGH (Palm Users Group in Hokkaido)
  _      master / shukaku.nu          (ぱふ)   http://www.pugh.palm-j.com/
                                             (旧URL: "http://i.am/PUGH")