Ruby で ブロック引数 を引数として受け取るように定義した場合(& を使って定義した場合)には、その引数をカッコでくくって与えるとエラーになる

結論

標題のとおりなのですが、実際の例を見るのが早いかと思います。

1. まずはメソッドを定義する

  • foobar というメソッドを定義します
  • 引数として「ブロック引数*1」を受け取るように定義します
def foobar(&block_hikisu)
  block_hikisu.call
end

2-1. OKな場合: foobar メソッドの引数として { puts 'Hello, Block Hikisu!' } を与えて実行する場合

  • この場合は OK です
> foobar { puts 'Hello, Block Hikisu!' }
Hello, Block Hikisu!

2-2. NGな場合: 2-1. と同様に foobar メソッドの引数として { puts 'Hello, Block Hikisu!' } を与えるけれども、カッコつきで与えて実行する場合

  • この場合はエラーが出ます
> foobar ({ puts 'Hello, Block Hikisu!' })
SyntaxError: unexpected '}', expecting end-of-input
...oobar ({ puts 'Hello, Block Hikisu!' })

補足

&block_hikisu の形で引数を定義した場合は、引数として Procオブジェクトを与えてもエラーとなります。

*1:ここでは &block_hikisu

Powered by はてなブログ