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 が戻り値をもたせられる事を知らなかったのですよね。。