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 を考えた時も、nexteach に渡されたブロックの処理を each に戻すだけなので、次の要素のブロック実行に移るだけだが、breakeach そのものを中断する。

たぶん用途は無いが、map のように戻り値を使うような場合だと以下のような事もできるみたい。

%w(a b c).map {|i|
  break '$' if i == 'b'
  i + '@'
}

# 実行結果
=> "$"

実はそもそも next が戻り値をもたせられる事を知らなかったのですよね。。