Ruby &&= 边界情况

7

有一点特殊,但你知道为什么&&=会表现出这种方式吗?我正在使用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

谢谢!


这篇文章是通过SymbolHound精心发现的! - New Alexandria
1个回答

11
这是因为@bar的值为false,所以&&=不会继续执行表达式...与你的第二个表达式形成对比,在第二个表达式中,无论后面的表达式返回什么值,都会将其赋值给@bar。同样的规则也适用于||=,它会计算整个表达式,而不管初始值@foo的值为何。
因此,你的前两个表达式的区别在于,在第一个表达式中,赋值取决于@bar的(未定义)值,而在第二种情况下,你进行了无条件的赋值。&&=不是x = x && y的简写形式。它是x = x && y if x的简写形式。

谢谢你澄清!我刚刚看到《Programming Ruby 1.9》中解释了这个问题...可能应该先查一下 :/ - Alan O'Donnell
如果我的回答解决了你的问题,@Alan,请随意接受它作为答案。 - hurikhan77
@AlanO'Donnell 这篇文章提供了详细的解释 关于这个主题。 - New Alexandria
2
这确实是 x = x && y 的快捷方式。 - blj
1
@blj 不是这样的... 在 Ruby 中,更像是 x && x = y... 你的建议会产生不同的结果。 - hurikhan77

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接