2015-05-29 158 views
6

任何人都可以在這個表達的光。看起來像兩個一樣,但他們不是。||之間的區別a = b和a = a || b在紅寶石?

a || a = b or a ||= b 

a = a || b 

如果

a = 4b = 6,輸出始終是4

這總是混淆和misconcept我。有人可以解釋嗎?

+1

可能需要閱讀[這篇文章](http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html )。 'a || a = b','a = a || b'和'a || = b'在本質上都略有不同。 – Oka

回答

10

查找a如果a是truthy,返回a,否則a = b完成即你b的值賦給a

a = a || b 

這是一個賦值操作。在這裏,您將值分配給a,而不考慮其保留的值。所以a等於a || b。在聲明的第二部分,您正在尋找a。如果它的價值是真的,你將它分配回a本身,否則你將b的值分配給a

TL; DR

a = a || b被分配值(取決於條件)a不論什麼值其持有。

a ||= b回報a如果已經存在,否則不a = b

解釋與例如:

你能想到的a || a = ba || (a = b)。現在讓我們假設a = 4b = 6

由於通過優先順序,這是一個OR操作和自運營的順序或爲從左向右,我們與第一a開始:

# lets call this Fig. 1 
     a || (a = b) 
    ^
     | 
     . 
    (here) 

a具有值4,這是一個truthy值。因此,評估停止,然後返回4。 (爲什麼?提示:true || anything = true

現在讓我們假設a = nilb = 6。我們從同一個地方重新開始(圖1)。由於anil,這在Ruby中是錯誤的,我們移動到OR操作的右側,即a = b

# lets call this Fig. 2 
     a || (a = b) 
      ^
       | 
       . 
      (here) 

由於這是一個賦值操作,它會被執行,我們最終會分配到6a

回到a = a || b。你可以認爲這是a = (a || b)。顯然按優先次序排序操作。由於分配操作的順序是從右到左,因此首先對(a || b)進行評估。

# lets call this Fig. 3 
     a = (a || b) 
      ^
      | 
      . 
      (here) 

如果a = 4b = 6a || b將返回4(如上所述)。否則,如果a = nilb = 6a || b將返回6

現在無論從這個||返回的任何值是分配給第一個a

# lets call this Fig. 4 
     a = (a || b) 
    ^
     | 
     . 
    (here) 
+0

感謝您的回答,您能否用可能有助於我們更好地理解的示例來解釋。 –

+0

@ChitrankSamaiya我試圖在我最近的編輯中用例子解釋我的答案。請檢查。 – shivam

+0

優秀的答案+1 –

4

一個常見誤解是:

a ||= b相當於a = a || b,但它的行爲就像a || a = b

a = a || b,一個被語句設置爲東西在每次運行,而與a || a = b,只有當a在邏輯上是錯誤的(即,如果它爲零或假)時才設置a,因爲||是'短路'。

讓我記住這簡單

也就是說,如果左手側||比較是真的,有 不需要檢查右邊。

多個參考RubyInside

相關問題