從一些個人的實驗我所看到的似乎是紅寶石的行爲「和」 /「& &」,似乎類似於if語句。使用&&(「和」)好像在ruby中一樣?
condition && action
似乎做得一樣
if condition
action
end
這些是相同呢?
從一些個人的實驗我所看到的似乎是紅寶石的行爲「和」 /「& &」,似乎類似於if語句。使用&&(「和」)好像在ruby中一樣?
condition && action
似乎做得一樣
if condition
action
end
這些是相同呢?
不,它們不完全等價。
如果condition
是false
:
condition && action
將返回false
但
if condition
action
end
將返回nil
。
這是一個小而細微的差異,但小的差異會導致大的錯誤。
這是因爲&&
短路。
採取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。也就是說,true
和false
是不在Ruby中唯一truthy和falsey值。實際上,除了nil
或false
之外,Ruby中的每個值都是真實的,只有這兩個例外是錯誤的。請注意,字符串"false"
和數字0
不是這兩個例外之一,所以它們實際上是真的。
我們現在可以充分描述a && b
的行爲:如果a
計算結果爲falsey值,然後a && b
返回a
的價值,用b
留下未評估
a
評估爲真值,則a && b
返回值b
,導致評估a
和b
。兩個和和& &是短路評價,但& &需要更高優先級和和需要較低優先級。下面是幾個例子,
a = 1
b = 2
c = a and b
# => 2
c
# => 1
c = a && b
# => 2
c
# => 2
所以,我們應該使用一些特定的地方和。
請在'=>'('#=>'或'#=>')之前加上一個英鎊符號('#'),這樣讀者就可以剪切並粘貼來運行代碼而無需額外編輯。這是一般性評論,並非針對這個問題。你可能希望指出'c = a和b'等價於'(c = a)和b','c = a && b'與'c =(a && b)'相同。 –
@CarySwoveland:我剛更新了答案,謝謝。 – Mohanraj
問題不是關於'&&'和'和',而是關於'if'和'&&'。 –
我認爲包括一個else分支評估爲'false'會使它們相同。否則,你的if表達式返回'nil'。 –
幾乎等同於; [Precedence](https://ruby-doc.org/core-2.4.1/doc/syntax/precedence_rdoc.html)有所不同。 '&&'是更高優先級的操作。 – Med
@ sagarpandya82:else分支應該返回'condition'。 –