是什么下面的线是什么意思?
a ||= {}
a ||= 1
在IRB
它总是返回类的,作为散列值,对于上述两种线。 在此先感谢。
是什么下面的线是什么意思?
a ||= {}
a ||= 1
在IRB
它总是返回类的,作为散列值,对于上述两种线。 在此先感谢。
||=
是赋值运算符,它返回分配的值。 a ||= b
相当于语句a || a = b
,这意味着如果a
被设置并且具有一些真实值,则它保持不变,否则取值为b
。
在您的示例中,a
仅设置一次,这解释了您已注意到的行为。
a ||= {}
a ||= 1 // a is still {}
我见过的典型用法是初始化静态变量,即。
class Foo
def self.bar
return @bar ||= {}
end
end
编辑:
它担负着提的是||=
是短路操作。这意味着它在a ||= b
的情况下将只有a = b
的分配。在a
非假的情况下,将不会有a = a
的转让。这有些迂腐,但在一些(非常)边缘情况下很重要。
欲了解更多信息,请致电read the definitive list of ||= threads and pages。
你的例子是一个实例变量,而不是一个静态(或类)变量。这将是'@@东西'。 [仍然是最好的回答:)] – 2011-03-08 08:54:45
@Simon只是注意到了同样的事情。现在修复(虽然,不完全是你的方式)。 – 2011-03-08 08:55:46
它也经常被用来检查指派的东西,在哈希值(A-LA:'哈希[关键] || = initial_value',特别是如果你下一步想做什么'哈希[键] + = value',这将如果'hash [key] .nil?'是true-ish),则出错。 – Romain 2011-03-08 09:16:14
你可以像这样读取“a || = {}”。如果定义了“a”,则忽略右侧的表达式。否则,设置“a”等于右侧的表达式。在第一行中,“a”可能是未定义的,所以行将“a”设置为右侧的表达式,即空散列。在第二行中,“a”已经设置为{},所以它忽略了右边的值为1的表达式。
它不检查是否一个被定义或没有,而是检查是否为真肥胖型(例如既不假不是nil)或没有。 – Romain 2011-03-09 11:12:04
好,更精确地说...它是否检查“一”是假的,零,或不确定的,分配“一”据此! – RubyFanatic 2011-03-09 18:48:30
正确,未定义不是真的,这是真的:) – Romain 2011-03-10 10:26:07
@mladen诚然,但我个人会投票结束其他问题青睐这一个。这个在最高评分答案中有更多最新/正确的信息。 – 2011-03-08 13:37:47
重复:[在Ruby中'|| ='是什么意思?](http://StackOverflow.Com/q/995593/),[在Ruby中'|| ='是什么意思?](http:// StackOverflow (http://stackOverflow.Com/q/3945711/),[在Ruby变量赋值中的双重管道符号?](http://q/3800957 /),[红宝石中的'|| ='是什么? /StackOverflow.Com/q/4500375/),['|| ='“操作数在ruby中的含义是什么](http://StackOverflow.Com/q/5124930/),[是Ruby运算符'| | | ='智能?](http://StackOverflow.Com/q/2989862/)以及其他许多人。 – 2011-03-08 17:34:01
另请参见[|| ='(或等于)线程和页面的最终列表](http://Ruby-Forum.Com/topic/151660/)。在Ruby中'|| ='是什么意思?](http://StackOverflow.Com/q/995593/)和[|| ='在Ruby中是什么意思?](http:// StackOverflow。Com/q/3800957 /)甚至链接到*相关问题*。 – 2011-03-08 17:35:44