ここで何が起こっているのかを理解しようとして、奇妙なケースが出てくるのを見ました:
> 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 キーワードにも当てはまり||ます。そのため、通常、単語よりも記号が推奨されます。