Ruby&& =边缘情况

时间:2010-06-06 02:57:43

标签: 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

谢谢!

1 个答案:

答案 0 :(得分:6)

这是因为@bar的计算结果为false,因此&&=将不再评估表达式...与您的第二个表达式相反,后者分配给任何@bar case,无论以下表达式解析如何。 ||=情况也是如此,无论初始值@foo解决了什么,它都会评估完整表达式。

因此,前两个表达式之间的区别在于,第一个赋值依赖于@bar的(未定义)值,而在第二个案例中,您执行无条件赋值。 &&=不是x = x && y的捷径。它是x = x && y if x的快捷方式。