块语法差异导致"LocalJumpError:no block given(yield)"

Bri*_*ong 15 ruby block

看到一个奇怪的案例,试图弄清楚这里发生了什么:

> 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)
Run Code Online (Sandbox Code Playgroud)

Ser*_*sev 21

解析器识别出这一点

p test do
  1
end
Run Code Online (Sandbox Code Playgroud)

就这样

(p test) do
  1
end
Run Code Online (Sandbox Code Playgroud)

块传递给p,而不是test.因此,yield不能屈服并引起那种错误.


Ale*_*yne 13

do并且{}表示附加到方法的块不是完全可互换的.

p test do
  1
end
Run Code Online (Sandbox Code Playgroud)

优先权正在困扰着你.这实际上是这样的:

p(test()) do
  1
end
Run Code Online (Sandbox Code Playgroud)

所以块被传递给了p,而不是test.

{}具有更高的优先级do,因此更紧密地绑定在语法上更接近的方法.对于具有符号等价物的其他ruby关键字也是如此,例如and/ &&or/ ||,这就是为什么通常建议使用符号的原因.


归档时间:

查看次数:

15599 次

最近记录:

7 年,5 月 前