块语法差异导致“LocalJumpError:no block given(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)
解析器识别出这一点
p test do 1 end
就这样
(p test) do 1 end
该块传递给p test
结果,而不是test
。 因此, yield
不能产生并引起错误。
do
和{}
表示附加到方法的块不是完全可互换的。
p test do 1 end
优先权正在困扰着你。 这实际上是这样的:
p(test()) do 1 end
所以块被传递给p
,而不是test
。
{}
具有比do
更高的优先级,因此更紧密地绑定到语法更接近的方法。 对于具有符号等价物的其他ruby关键字也是如此,例如and
/ &&
和/ ||
这就是为什么通常建议使用符号的原因。