下面的代码在Ruby中是什么意思?
||=
它的语法有什么意义或原因吗?
下面的代码在Ruby中是什么意思?
||=
它的语法有什么意义或原因吗?
当前回答
A ||= b和A = b是一样的如果A。nil?或者a = b,除非a
但是所有3个选项都能显示相同的性能吗?在Ruby 2.5.1中
1000000.times do
a ||= 1
a ||= 1
a ||= 1
a ||= 1
a ||= 1
a ||= 1
a ||= 1
a ||= 1
a ||= 1
a ||= 1
end
在我的电脑上花费0.099秒,而
1000000.times do
a = 1 unless a
a = 1 unless a
a = 1 unless a
a = 1 unless a
a = 1 unless a
a = 1 unless a
a = 1 unless a
a = 1 unless a
a = 1 unless a
a = 1 unless a
end
用时0.062秒。这几乎快了40%。
然后我们还有:
1000000.times do
a = 1 if a.nil?
a = 1 if a.nil?
a = 1 if a.nil?
a = 1 if a.nil?
a = 1 if a.nil?
a = 1 if a.nil?
a = 1 if a.nil?
a = 1 if a.nil?
a = 1 if a.nil?
a = 1 if a.nil?
end
这需要0.166秒。
并不是说这将在一般情况下产生重大的性能影响,但是如果您确实需要最后一点优化,那么可以考虑这个结果。 顺便说一下:a = 1,除非a对新手来说更容易理解,否则它是不言自明的。
注1:重复分配行多次的原因是为了减少循环在测量时间上的开销。
注2:如果我在每次赋值前执行a=nil,结果是类似的。
其他回答
一个常见的误解是,||= b并不等同于a = a || b,但它的行为就像|| a = b。
但这里有一个棘手的情况。如果a未定义,则|| a = 42将引发NameError,而||= 42将返回42。所以,它们似乎不是等价的表达式。
简洁完整的回答
a ||= b
计算方法与下面每一行相同
a || a = b
a ? a : a = b
if a then a else a = b end
-
另一方面,
a = a || b
计算方法与下面每一行相同
a = a ? a : b
if a then a = a else a = b end
-
编辑:正如AJedi32在评论中指出的那样,这只在以下情况下成立:A是一个已定义变量。2. 计算一次时间和两次时间不会导致程序或系统状态的差异。
irb(main):001:0> a = 1
=> 1
irb(main):002:0> a ||= 2
=> 1
因为a已经被设为1了
irb(main):003:0> a = nil
=> nil
irb(main):004:0> a ||= 2
=> 2
因为a是nil
这是默认的赋值表示法
例如:x ||= 1 这将检查x是否为nil。如果x确实为nil,那么它就会赋给它一个新值(在我们的例子中是1)
更明确的表示: 如果x == nil X = 1 结束
ruby-lang语法。正确的答案是查看ruby-lang文档。所有其他解释都令人困惑。
谷歌
"ruby-lang文档缩写赋值"。
Ruby-lang文档
https://docs.ruby-lang.org/en/2.4.0/syntax/assignment_rdoc.html#label-Abbreviated+Assignment