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,因此与语法上更接近的方法绑定得更紧密。对于其他具有符号等价物的 ruby​​ 关键字也是如此,例如and/&&or/ ||,这就是为什么通常建议使用符号而不是单词的原因。

于 2013-09-04T20:48:17.610 回答