まつもと ゆきひろです

In message "[ruby-list:20221] while TRUE と loop の違いを教えてください"
    on 00/01/15, Sakae Kobayashi <sakae / ps.ksky.ne.jp> writes:

|[sakae / t515m]$ cat test.rb
|loop do
|  print "-> ", eval(gets), "\n"
|end
|
|[sakae / t515m]$ ruby test.rb
|abc=123
|-> 123
|abc
|test.rb:2: (eval):1: undefined local variable or method `abc' for #<Object:0x807becc> (NameError)

|しかし、loop do を while TRUE に変更すると何の問題もなく、期待する動作を
|してくれます。
|
|この違いはどのように解釈したらよろしいのでしょうか?

制御構造であるwhileとイテレータであるloopの間の本質的な違い
はloopの方はループ本体がブロックである点です。そしてブロック
は新たなスコープを導入します。

この場合、新しいスコープで初出の変数であるabcはブロック内で
だけ有効で、loopの次の回の繰り返しの時には消滅してしまいます。
たとえば、loopの前に変数 abc に対する代入が行われていれば、
abcの有効範囲がメソッド全体になりますから、ブロックの実行終
了によって消滅することはありません。

                                まつもと ゆきひろ /:|)