块语法差异导致“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 / &&和/ || 这就是为什么通常建议使用符号的原因。