我在ActiveRecord模型中有一个验证器,其中我遇到了一些真的很奇怪的行为。为什么解释的代码不能影响Ruby中的“消息”行为?
例子:
if status_changed?
p status # output on line below
# <= "my_status_1"
p my_conditions_1 # output on line below
# <= false
if my_conditions_1
errors.add(:status, 'Error1')
status = status_was
end
p status # output on line below
# <= nil
# my_conditions_2 depends on "status variable"
if my_conditions_2
errors.add(:status, 'Error2')
status = 2
end
end
第二个条件总是失败,因为status
不知何故被设置好的为零。 但当我改变status
到self.status
一切开始按预期工作。
修订
我已经得到了规则,在指定属性的情况下,我必须使用self
,感谢大家谁解释它。但是,代码的行为的一部分仍然不明显,我
更普遍的例子:
class Detector
def status
"Everything ok"
end
def check
p status
# <= "Everything ok"
if false
status = "Danger!"
end
p status
# <= nil
end
end
detector = Detector.new
detector.check
有人能解释一下吗?怎么不解释的代码可以从方法消息“重定向”给一个变量?可以吗?
如果my_conditions_1是真的,你只能给'status'分配一些东西。那么,如果'my_conditions_1'是假的,会发生什么?那么'status'是未初始化的,未初始化的局部变量的计算结果为'nil',就像实例变量一样。 –
@JörgWMittag那么如何在第一次分配前正确打印出来? –
因为它在第一次赋值之前不存在,因此被解释为方法调用,并且可能该方法返回某个值。 –