Ruby の next, break でよく分かってなかったこと
繰り返し (for とか while とか)や case とかで使うためだけかと思ってた。C# の continue, break と同じイメージ。
ブロック内での挙動
よく考えると、each とかでも渡したブロック内で next って書くことあったけど、なんで使えるか分かってなかった。
def display_method puts yield puts 'after yield' end display_method do 123 end # 実行結果 123 => nil display_method do next 10 123 end # 実行結果 10 => nil display_method do break 10 123 end # 実行結果 => 10
ブロック内での next は呼び出し元(ここでは yield)に処理を戻す事ができる。よって、puts に戻り値が渡っている。
ブロック内での break は呼び出しているメソッド自体の処理を中断する。よって、puts に戻り値は渡らないが、変わりにメソッドの戻り値になる。
なので each を考えた時も、next は each に渡されたブロックの処理を each に戻すだけなので、次の要素のブロック実行に移るだけだが、break は each そのものを中断する。
たぶん用途は無いが、map のように戻り値を使うような場合だと以下のような事もできるみたい。
%w(a b c).map {|i| break '$' if i == 'b' i + '@' } # 実行結果 => "$"
実はそもそも next が戻り値をもたせられる事を知らなかったのですよね。。