2011-03-08 144 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

相關問題