loopメソッドは、終了条件のない繰り返しのメソッドです。
動作としては、以下に書くように、「while true」と書いた場合と同じ動作となりますので、繰り返し処理を記述するブロック内において、break文などでループを抜けなければなりません。
でなければ、無限ループとなり、メモリを使い果たします。
追記(2009年5月8日)
コメントにて、tさんよりご指摘を頂いたので修正しました。
上記、打ち消し線を引いた箇所は、変数のスコープという観点から、厳密には間違いです。
loopとwhile trueは、同じ動作とならない場合があります。
loopとwhile trueの違いを検証したエントリーを書きました。参考:loop と while true の違い - Ruby入門勉強ルーム
count = 0
loop do
puts "Hello, Ruby !"
if count == 3
break
end
count += 1
end
num = 0
while true do
puts "while case : Hello, Ruby !"
if num == 3
break
end
num += 1
end
実行結果。
Hello, Ruby ! Hello, Ruby ! Hello, Ruby ! Hello, Ruby ! while case : Hello, Ruby ! while case : Hello, Ruby ! while case : Hello, Ruby ! while case : Hello, Ruby !
"「while true」と書いた場合と同じ動作となります"とあるのは、厳密には誤りです。loopはブロックを引数にとる関数です。制御構造であるwhileとは変数のスコープが異なります。たとえば、以下の二つのスクリプトは異なった動作を示します。
#------------------------------
loop do
var = "test"
puts var
break
end
puts var
#------------------------------
while true
var = "test"
puts var
break
end
puts var
tさん、ご指摘ありがとうございました。
loopは、メソッドなので「var = "test"」のスコープがブロックの中に閉じ込められるのですね。
■この記事のトラックバックURL:
http://www.mapee.jp/mpe334/mt-tb.cgi/336