よもやま話β版

よもやま話を書きます

Rubyのnext, return の違いを再履修

qiita.com

完璧にハマったところを、上記記事に救われました。感謝... :pray:
自分でも再履修してみる。

サンプル

次のような実行結果を期待してコードを書いたとします。

hey
hello
hello
# hello.rb
def hello
  3.times.map do |n|
    return 'hey' if n.zero?
    'hello'
  end
end

puts hello

しかし実際の実行結果は次のようになります。

hey

なぜそうなるのか

return の説明を改めて見直してみます。
https://docs.ruby-lang.org/ja/2.5.0/doc/spec=2fcontrol.html#return

式の値を戻り値としてメソッドの実行を終了します。

hello.rbreturn と書いているのはブロック内ですが、あくまでメソッドの終了を支持しているので、helloメソッドの戻り値として「hey」が返されました。ブロックの戻り値を指定したい場合は next を使います。

https://docs.ruby-lang.org/ja/2.5.0/doc/spec=2fcontrol.html#next

nextはもっとも内側のループの次の繰り返しにジャンプします。

# hello.rb
def hello
  3.times.map do |n|
    next 'hey' if n.zero?
    'hello'
  end
end

puts hello
hey
hello
hello

基本はメソッドが戻り値を返すコードを書くのですが、そのノリでブロック内でreturnを使うとまずいですね。

ちなみにバグは自動テスト(RSpec)によって気づくことができました。
やはりテストは重要。