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