看到一个奇怪的案例出现,试图弄清楚这里发生了什么:
> 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
,因此与语法上更接近的方法绑定得更紧密。对于其他具有符号等价物的 ruby 关键字也是如此,例如and
/&&
和or
/ ||
,这就是为什么通常建议使用符号而不是单词的原因。