2017-08-30 72 views
3

從一些個人的實驗我所看到的似乎是紅寶石的行爲「和」 /「& &」,似乎類似於if語句。使用&&(「和」)好像在ruby中一樣?

condition && action 

似乎做得一樣

if condition 
    action 
    end 

這些是相同呢?

+0

我認爲包括一個else分支評估爲'false'會使它們相同。否則,你的if表達式返回'nil'。 –

+0

幾乎等同於; [Precedence](https://ruby-doc.org/core-2.4.1/doc/syntax/precedence_rdoc.html)有所不同。 '&&'是更高優先級的操作。 – Med

+0

@ sagarpandya82:else分支應該返回'condition'。 –

回答

1

不,它們不完全等價。

如果conditionfalse

condition && action 

將返回false

if condition 
    action 
end 

將返回nil

這是一個小而細微的差異,但小的差異會導致大的錯誤。

4

這是因爲&&短路。

採取a && b。如果a的計算結果爲false,則無論b是什麼,表達式都爲false,因此爲了避免浪費時間b未被評估。只有在a評估爲真時,才需要評估b

有用於||(「或」)類似的短路行爲。你能弄清楚它是什麼嗎?

[編輯]

由於霍爾格纔剛剛指出,when I say a "true" value in Ruby, I mean any truthy value, and when I mention a "false" value in Ruby, I mean any falsey value。也就是說,truefalse在Ruby中唯一truthy和falsey值。實際上,除了nilfalse之外,Ruby中的每個值都是真實的,只有這兩個例外是錯誤的。請注意,字符串"false"和數字0不是這兩個例外之一,所以它們實際上是真的。

我們現在可以充分描述a && b的行爲:如果a計算結果爲falsey值,然後a && b返回a的價值,用b留下未評估

  • 如果a評估爲真值,則a && b返回值b,導致評估ab
+2

它應該指出,只要你在你的答案中提到「錯誤」,它實際上是一個虛假的值(即一個字面的'nil'或'false'),當說到「真」時,它的任何真實值比'nil'或'false')。 –

+0

我被不止一次的被真理咬過:''false''(作爲一個字符串)也是真實的。 – moveson

+0

@CarySwoveland我已經納入了你的一些建議。 – ogogmad

1

兩個& &是短路評價,但& &需要更高優先級和需要較低優先級。下面是幾個例子,

a = 1 
b = 2 
c = a and b 
# => 2 
c 
# => 1 
c = a && b 
# => 2 
c 
# => 2 

所以,我們應該使用一些特定的地方

+0

請在'=>'('#=>'或'#=>')之前加上一個英鎊符號('#'),這樣讀者就可以剪切並粘貼來運行代碼而無需額外編輯。這是一般性評論,並非針對這個問題。你可能希望指出'c = a和b'等價於'(c = a)和b','c = a && b'與'c =(a && b)'相同。 –

+0

@CarySwoveland:我剛更新了答案,謝謝。 – Mohanraj

+0

問題不是關於'&&'和'和',而是關於'if'和'&&'。 –

相關問題