lambda と -> の違い

同じかと思ってたけど振る舞いが異なるケースがあった

def hoge(name, block)
  puts name
  block.call
end

hoge :fuga, -> { puts 'foo' }
hoge :fuga, lambda { puts 'foo' }
hoge :fuga, -> do puts 'foo' end
hoge :fuga, lambda do puts 'foo' end

最後の例でこうなる

hoge.rb:9:in `lambda': tried to create Proc object without a block (ArgumentError)

do ... end は結合強度的に hoge にブロック渡す(のでこのケースではエラーになる)はずだけど、 -> と併用した場合は do...end の代わりに { } を使用したのと同じような形になるんですかね。

合わせて読みたい

do...endと{...}の違い - おもしろWEBサービス開発日記