ここで何が起こっているのかを理解しようとして、奇妙な事件が発生するのを見ました:
> def test
> p yield
> end
=> nil
> test { 1 }
1
=> 1
> p test { 1 }
1
1
=> 1
> p test do
> 1
> end
LocalJumpError: no block given (yield)
パーサーはこれを認識します
p test do
1
end
このように
(p test) do
1
end
ブロックはp
ではなくtest
に渡されます。したがって、yield
は降伏できず、そのエラーが発生します。
メソッドにアタッチされたブロックを示すdo
と{}
は、完全に互換性があるわけではありません。
p test do
1
end
優先順位はあなたを台無しにしています。これは実際にはこれです:
p(test()) do
1
end
したがって、ブロックはp
ではなくtest
に渡されます。
{}
はdo
よりも優先順位が高いため、構文的に近いメソッドにより厳密にバインドされます。これは、and
/&&
やor
/||
など、記号的に同等のキーワードを持つ他のRubyキーワードにも当てはまります。そのため、通常、単語よりも記号が推奨されます。