Ruby 2.7 アドベントカレンダーの5日目の記事です。
ブロックを伴わない proc / lambda
今までブロックを伴わない proc / lambda はそのメソッドの呼び出し側で指定されたブロックを Proc オブジェクトとして返していました。lambda は warning が出ていました。 細かいことをいうと、proc も lambda も 1.8.7 では warning が出ていたけど、1.9 からは lambda だけ warning になってたようです。理由までは調べてません。
それが 2.7 では proc で warning、lambda でエラーになるようになりました。
def hoge proc end def fuga lambda end # Ruby 2.6 hoge { p 123 } #=> #<Proc:0x000055c32f51eee0@test.rb:10> fuga { p 123 } #=> #<Proc:0x000055c32f51ed28@test.rb:11 (lambda)> #=> warning: tried to create Proc object without a block # Ruby 2.7 hoge { p 123 } #=> #<Proc:0x00005623e80d22f0 test.rb:10> #=> warning: Capturing the given block using Kernel#proc is deprecated; use `&block` instead fuga { p 123 } #=> tried to create Proc object without a block (ArgumentError)
というか、自分はブロックなしの proc / lambda が書けることすら知りませんでした(知ってたかも知れないけどもう忘れてる)。
もし使ってた人は今後はちゃんと &
でブロックを引数として受けるようにしましょう。
def hoge(&block) block end hoge { p 123 } #=> #<Proc:0x000055a9aa88f140 test.rb:4>