繰り返しの中で、ループ処理を中断したり、特定の回のループを飛ばしたりする場合は、break, next, redoなどを使います。
break
繰り返しを中断して、ループを抜ける。
next
現在の回を飛ばして、次の回のループに移る。
redo
同じ条件で、ループをやり直す。
breakについては、処理を中断しループ脱出するだけですので、簡単なので理解しやすいです。
Rubyのbreak, nextは、PHPやCで言うところの、break, continueに、またPerlのlast, nextと同じです。
分かりにくいのは、nextとredoの違いです。
nextはループ処理を先頭に戻すのですが、その処理をブロック外の条件評価のところからはじめます。
一方で、redoの場合、次の回が、ブロック内の先頭の部分からはじまりますので、ループ条件評価は行われません。
redoの場合、同じ条件において、ブロック内の繰り返し処理をやり直す、ということになります。
array = ['Ruby', 'Perl', 'PHP', 'Python', 'JavaScript', 'C++', 'Java']
puts "----- break ------"
count = 0
array.each{ |item|
count += 1
if count == 3
break
end
print count, " : ", item, "\n"
}
puts "\n----- next ------"
count = 0
array.each{ |item|
count += 1
if count == 3
next
end
print count, " : ", item, "\n"
}
puts "\n----- redo ------"
count = 0
array.each{ |item|
count += 1
if count == 3
redo
end
print count, " : ", item, "\n"
}
実行結果。
----- break ------ 1 : Ruby 2 : Perl ----- next ------ 1 : Ruby 2 : Perl 4 : Python 5 : JavaScript 6 : C++ 7 : Java ----- redo ------ 1 : Ruby 2 : Perl 4 : PHP 5 : Python 6 : JavaScript 7 : C++ 8 : Java
nextの場合、「count == 3」の時のループ処理が飛ばされて、配列の値「'PHP'」も飛ばされています。
しかし、redoでは、「count == 3」から1つカウントアップされた後、同じ条件で繰り返し処理をやり直すので、配列の値「'PHP'」が表示されています。
■この記事のトラックバックURL:
http://www.mapee.jp/mpe334/mt-tb.cgi/337