为什么最后一个语句(语句末尾的"if(tmp2 = foo)")失败?
def foo;5;end
# this one works
if (tmp = foo)
puts tmp.to_s
end
# why this one fails
puts tmp2.to_s if (tmp2 = foo) #=> undefined local variable or method ‘tmp2’ for main:Object
Run Code Online (Sandbox Code Playgroud)
由于解析器的工作方式,它失败了.
从解析器的角度来看,变量tmp2从它首次被分配的代码中的点开始存在,直到它超出范围.为此,无论何时(或如果)实际执行赋值,只是在解析器看到赋值时(即它取决于代码中的赋值位置).
编辑:要扩展该位:
解析器决定名称是局部变量还是方法调用.解析器仅根据是否已经看到对该变量的赋值来做出该决定.因此,当解析器在看到之前看到tmp2时tmp2 = ...,它决定在这里tmp2引用一个方法.当代码的那部分实际执行时,它会尝试调用不存在的方法tmp2,这样你就会得到错误.
| 归档时间: |
|
| 查看次数: |
1370 次 |
| 最近记录: |