任何人都可以在這個表達的光。看起來像兩個一樣,但他們不是。||之間的區別a = b和a = a || b在紅寶石?
a || a = b or a ||= b
和
a = a || b
如果
a = 4
和b = 6
,輸出始終是4
這總是混淆和misconcept我。有人可以解釋嗎?
任何人都可以在這個表達的光。看起來像兩個一樣,但他們不是。||之間的區別a = b和a = a || b在紅寶石?
a || a = b or a ||= b
和
a = a || b
如果
a = 4
和b = 6
,輸出始終是4
這總是混淆和misconcept我。有人可以解釋嗎?
查找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 = b
爲a || (a = b)
。現在讓我們假設a = 4
和b = 6
。
由於通過優先順序,這是一個OR操作和自運營的順序或爲從左向右,我們與第一a
開始:
# lets call this Fig. 1
a || (a = b)
^
|
.
(here)
這a
具有值4,這是一個truthy值。因此,評估停止,然後返回4
。 (爲什麼?提示:true || anything = true
)
現在讓我們假設a = nil
和b = 6
。我們從同一個地方重新開始(圖1)。由於a
是nil
,這在Ruby中是錯誤的,我們移動到OR操作的右側,即a = b
# lets call this Fig. 2
a || (a = b)
^
|
.
(here)
由於這是一個賦值操作,它會被執行,我們最終會分配到6
a
。
回到a = a || b
。你可以認爲這是a = (a || b)
。顯然按優先次序排序操作。由於分配操作的順序是從右到左,因此首先對(a || b)
進行評估。
# lets call this Fig. 3
a = (a || b)
^
|
.
(here)
如果a = 4
和b = 6
,a || b
將返回4
(如上所述)。否則,如果a = nil
和b = 6
,a || b
將返回6
。
現在無論從這個||
返回的任何值是分配給第一個a
。
# lets call this Fig. 4
a = (a || b)
^
|
.
(here)
感謝您的回答,您能否用可能有助於我們更好地理解的示例來解釋。 –
@ChitrankSamaiya我試圖在我最近的編輯中用例子解釋我的答案。請檢查。 – shivam
優秀的答案+1 –
一個常見誤解是:
a ||= b
相當於a = a || b
,但它的行爲就像a || a = b
在a = a || b
,一個被語句設置爲東西在每次運行,而與a || a = b
,只有當a在邏輯上是錯誤的(即,如果它爲零或假)時才設置a,因爲||是'短路'。
讓我記住這簡單:
也就是說,如果左手側||比較是真的,有 不需要檢查右邊。
多個參考RubyInside
可能需要閱讀[這篇文章](http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html )。 'a || a = b','a = a || b'和'a || = b'在本質上都略有不同。 – Oka