Ruby && =边缘情况

Ala*_*ell 6 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?
Run Code Online (Sandbox Code Playgroud)

为了比较,|| =将实例变量初始化为nil,正如我所期望的那样:

obj = Object.new
obj.instance_eval {@foo ||= @foo}
obj.instance_variables # => [:@foo], where @foo is set to nil
Run Code Online (Sandbox Code Playgroud)

谢谢!

hur*_*n77 8

这是因为@bar计算结果为false,因此将&&=不再评估表达式...与您的第二个表达式相反@bar,无论在何种情况下,无论下面的表达式解析为什么.||=无论@foo解决了什么初始值,评估完整表达式的情况都是如此.

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

  • 它确实是x = x && y的捷径 (2认同)