break, next, redoの違い

はてなブックマークに追加はてなブックマーク Yahoo!ブックマークに登録 ニフティクリップに追加 Livedoor クリップに追加 BuzzurlにブックマークBuzzurlにブックマーク Twitterに投稿  

繰り返しの中で、ループ処理を中断したり、特定の回のループを飛ばしたりする場合は、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'」が表示されています。


日時: 2008年06月23日 22:32
コメントを投稿






トラックバック

■この記事のトラックバックURL:
http://www.mapee.jp/mpe334/mt-tb.cgi/337

この記事にトラックバックされる方は、参照先が分かるようにするために、「break, next, redoの違い」へのリンクをお願いいたします。
以下のHTMLタグをトラックバック送信元ページ内に挿入して下さい。



※この記事へのリンクがない、また関連のないページからのトラックバックは反映されませんので、ご了承下さい。






あわせて読みたいブログパーツ
フィードメーター - Ruby勉強ルーム