完璧にハマったところを、上記記事に救われました。感謝... :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.rb
で return
と書いているのはブロック内ですが、あくまでメソッドの終了を支持しているので、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)によって気づくことができました。
やはりテストは重要。