Ruby && =边缘情况
有点边缘情况,但任何想法为什么&& =会这样做? 我正在使用1.9.2。
obj = Object.new obj.instance_eval {@bar &&= @bar} # => nil, expected obj.instance_variables # => [], so obj has no @bar instance variable obj.instance_eval {@bar = @bar && @bar} # ostensibly the same as @bar &&= @bar obj.instance_variables # => [:@bar] # why would this version initialize @bar?
为了比较,|| =将实例变量初始化为nil,正如我所期望的那样:
obj = Object.new obj.instance_eval {@foo ||= @foo} obj.instance_variables # => [:@foo], where @foo is set to nil
谢谢!
这是因为@bar
计算结果为false,因此&&=
将不再评估表达式…与您的第二个表达式@bar
,无论如何分配给@bar
,无论以下表达式如何解析。 无论@foo
解析为什么初始值,都会对||=
case进行评估完整表达式。
因此,前两个表达式之间的区别在于,第一个赋值取决于@bar
的(未定义)值,而在第二个案例中,您执行无条件赋值。 &&=
不是x = x && y
的快捷方式。 如果是x = x && y if x
它是x = x && y if x
的快捷方式。