看到一个奇怪的案例,试图弄清楚这里发生了什么:
> 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)
答案 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
/ ||
,这就是为什么通常建议使用符号的原因