我在Ruby中有一个奇怪的行为:
var1.zero? if var1 = 1
NameError
:未定义的局部变量或方法var1
for main:Object
另一方面,如果我在标准if
中做同样的事情,那么所有工作都按预期进行:
if var1 = 1
var1.zero?
end
# => false
任何人都可以描述Ruby中的后缀if
如何工作?
答案 0 :(得分:4)
因为如果我问你
我女儿不可爱......
你会打扰我
你有女儿吗?
在我完成我的初始判决之前
我女儿不可爱,这是她的[显示图片] ?
但如果我问你
[显示图片]这是我的女儿,是不是很可爱?
您可以轻松回复
没有
答案 1 :(得分:2)
这是因为局部变量在赋值后可用(并且按词法顺序而不是按执行顺序完成)。
因此postfix-if的condition子句不会更改其主体中可用的可用局部变量的列表。但实际上它是一个任务。您可以通过忽略异常并检查var1
值来检查它:
var1.zero? rescue nil if var1 = 1
puts(var1)
您还可以注意到实例变量以不同的方式工作:它们不会引发未定义变量的错误。
有关其他信息,请查看ruby bug跟踪器中的issue。
答案 2 :(得分:0)
它会从左到右,首先会显示var1.zero?
,然后是if var1 = 1
var1.zero? if var1 = 1
这就是var1
NameError:未定义的局部变量或方法`var1' for main:Object
在这里,
if var1 = 1
var1.zero?
end
var1 = 1
将创建值为1的var1,因此它不会抛出错误。当它执行var1.zero?
时。