我正在阅读编程Ruby,实用程序员指南( Pick ),作者声称:
var = var || "Default Value"以及:
var || = "Default Value"我不明白这一点,因为这和我所能看到的没有什么不同。有人能帮我吗?
发布于 2016-01-12 05:26:44
引用资源这里
在a=a\b中,a是通过每次运行时的语句设置为某个值的,而如果使用了一个{##**$$}}a= b,则只有当a在逻辑上是假的(即如果它是空的或假的)时,才会设置a,因为它是‘短路’。也就是说,如果比较的左手边是真的,就没有必要检查右手边。
这基本上意味着它们的行为与开发工具类似,但在内部,实现与上面解释的不同。
编辑:正如注释中指出的,上面的解释认为a || a = b而不是a ||= b。一个非常好的观点和阅读同样的链接进一步澄清了这一点:
如果未定义a,则用x= 42引发NameError,而||= 42则返回42。所以,它们似乎不是等价的表达方式。
因此,同样,它们不是相同的语句,因为Ruby在解析时看到赋值时就分配了一个变量(这是a ||= 42的情况)。
最后一句,你不会认为这是我编造的,:)
Ruby在解析阶段看到了赋值,并且创建变量的方式并不是用x= 42,尽管一旦实际执行发生,它的行为就会像后者一样。
发布于 2016-01-12 06:09:52
如果使用带有getter和setter的类,这种区别就会变得更加明显:
class Foo
def var
puts 'Foo#var called'
@var
end
def var=(value)
puts 'Foo#var= called'
@var = value
end
end您的第一个示例导致调用Foo#var=的时间非常长:
f = Foo.new
f.var = f.var || "Default Value"
# Foo#var called
# Foo#var= called
f.var = f.var || "Default Value"
# Foo#var called
# Foo#var= called而在第二个示例中,Foo#var=只被调用一次:
f = Foo.new
f.var ||= "Default Value"
# Foo#var called
# Foo#var= called
f.var ||= "Default Value"
# Foo#var calledhttps://stackoverflow.com/questions/34736116
复制相似问题