看到一个奇怪的案例,试图弄清楚这里发生了什么:
> 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 次 |
| 最近记录: |