Ruby 2.7 の変更点 - ブロックを伴わない proc / lambda

Ruby 2.7 アドベントカレンダーの5日目の記事です。

qiita.com

ブロックを伴わない 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>