16

ここで何が起こっているのかを理解しようとして、奇妙なケースが出てくるのを見ました:

> 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)
4

2 に答える 2

23

パーサーはこれを認識します

p test do
  1
end

このように

p(test) do
  1
end

pブロックはではなくに渡されtestます。したがって、yield譲れず、そのエラーが発生します。

于 2013-09-04T20:48:08.877 に答える
16

doまた{}、メソッドにアタッチされたブロックが完全に交換可能ではないことを示します。

p test do
  1
end

優先順位はあなたを台無しにしています。これは実際には次のとおりです。

p(test()) do
  1
end

pしたがって、ブロックはではなくに渡されtestます。

{}よりも優先順位が高いdoため、構文的に近いメソッドにより強くバインドされます。andこれは、 /&&or/などの記号に相当する他の Ruby キーワードにも当てはまり||ます。そのため、通常、単語よりも記号が推奨されます。

于 2013-09-04T20:48:17.610 に答える