2011-03-08 101 views
8

可能重复:
What does ||= mean in Ruby?|| = Ruby语言中的含义是什么?

是什么下面的线是什么意思?

a ||= {} 
a ||= 1 
在IRB

它总是返回类的,作为散列值,对于上述两种线。 在此先感谢。

+0

@mladen诚然,但我个人会投票结束其他问题青睐这一个。这个在最高评分答案中有更多最新/正确的信息。 – 2011-03-08 13:37:47

+0

重复:[在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

+0

另请参见[|| ='(或等于)线程和页面的最终列表](http://Ruby-Forum.Com/topic/151660/)。在Ruby中'|| ='是什么意思?](http://StackOverflow.Com/q/995593/)和[|| ='在Ruby中是什么意思?](http:// StackOverflow。Com/q/3800957 /)甚至链接到*相关问题*。 – 2011-03-08 17:35:44

回答

0

这意味着

a = a || {} 

a = {} unless a 
+1

不完全。如果a为假,它也会设置为{}。 – Dogbert 2011-03-08 08:50:05

+0

是的,我刚刚注意到,由于;-) – 2011-03-08 08:51:03

+0

,它不会分配到如果这是真的十岁上下。 – Romain 2011-03-09 11:12:38

16

||=是赋值运算符,它返回分配的值。 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

+0

你的例子是一个实例变量,而不是一个静态(或类)变量。这将是'@@东西'。 [仍然是最好的回答:)] – 2011-03-08 08:54:45

+0

@Simon只是注意到了同样的事情。现在修复(虽然,不完全是你的方式)。 – 2011-03-08 08:55:46

+0

它也经常被用来检查指派的东西,在哈希值(A-LA:'哈希[关键] || = initial_value',特别是如果你下一步想做什么'哈希[键] + = value',这将如果'hash [key] .nil?'是true-ish),则出错。 – Romain 2011-03-08 09:16:14

0

你可以像这样读取“a || = {}”。如果定义了“a”,则忽略右侧的表达式。否则,设置“a”等于右侧的表达式。在第一行中,“a”可能是未定义的,所以行将“a”设置为右侧的表达式,即空散列。在第二行中,“a”已经设置为{},所以它忽略了右边的值为1的表达式。

+0

它不检查是否一个被定义或没有,而是检查是否为真肥胖型(例如既不假不是nil)或没有。 – Romain 2011-03-09 11:12:04

+0

好,更精确地说...它是否检查“一”是假的,零,或不确定的,分配“一”据此! – RubyFanatic 2011-03-09 18:48:30

+0

正确,未定义不是真的,这是真的:) – Romain 2011-03-10 10:26:07

相关问题