块语法差异导致“LocalJumpError:no block given(yield)”

时间:2013-09-04 20:45:15

标签: ruby block

看到一个奇怪的案例,试图弄清楚这里发生了什么:

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

2 个答案:

答案 0 :(得分:19)

解析器识别此

p test do
  1
end

这个

(p test) do
  1
end

该块传递给p,而不是test。因此,yield无法屈服并引发该错误。

答案 1 :(得分:13)

do{}表示附加到方法的块不是完全可互换的。

p test do
  1
end

优先权正在困扰着你。实际上就是这样:

p(test()) do
  1
end

因此阻止传递给p,而不是test

{}的优先级高于do,因此与语法更紧密的方法绑定得更紧密。对于具有符号等价物的其他ruby关键字也是如此,例如and / &&or / ||,这就是为什么通常建议使用符号的原因