web-dev-qa-db-ja.com

ブロック構文の違いにより、「LocalJumpError:ブロックが指定されていません(yield)」が発生します

ここで何が起こっているのかを理解しようとして、奇妙な事件が発生するのを見ました:

> 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)
15
Brian Armstrong

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

p test do
  1
end

このように

(p test) do
  1
end

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

20

メソッドにアタッチされたブロックを示すdo{}は、完全に互換性があるわけではありません。

p test do
  1
end

優先順位はあなたを台無しにしています。これは実際にはこれです:

p(test()) do
  1
end

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

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

13
Alex Wayne