我正在學習ruby,並且遇到了可能的簡單問題。還有就是代碼:爲什麼括號會改變返回值?
str = 'abc'
a = 1
b = 2
a = str.reverse if str.size > 3
b = (str.reverse if str.size > 3)
p a
p b
輸出:
1
nil
有人可以告訴我這些括號中的返回值的變化?
這是一種「塊」的代碼?
我正在學習ruby,並且遇到了可能的簡單問題。還有就是代碼:爲什麼括號會改變返回值?
str = 'abc'
a = 1
b = 2
a = str.reverse if str.size > 3
b = (str.reverse if str.size > 3)
p a
p b
輸出:
1
nil
有人可以告訴我這些括號中的返回值的變化?
這是一種「塊」的代碼?
它們是兩種不同的陳述。
第一種是有條件分配:
a = str.reverse if str.size > 3
的if
適用於整條生產線。如果str.size
不大於3,那麼絕對沒有任何反應; a
根本沒有觸及。你也可以寫這樣說:
if str.size > 3 then
a = str.reverse
end
如果能夠堅持在if
上剛剛結束,您可以在一個行,而不是塊做。
第二個是一個條件值的分配。
b = (str.reverse if str.size > 3)
無論如何,b
的值都會隨時改變; str.size
的值只是確定它將更改爲。你也可以使用的if
的塊狀這裏:
b = if str.size > 3 then
str.reverse
end
最重要的區別是,分配給b
發生在if
之外,所以它不是條件;它總是發生。
圓括號不會創建塊,但它們確實確定優先級。只要你有一個可以用多種方式解釋的陳述取決於事情發生的順序,實際發生的事情是由優先規則決定的。舉例來說,標準的運算規則告訴我們,這是真的:
3 + 2 × 4 = 11
答案不是20,因爲乘法的優先級高於加法。圓括號讓你改變它;以上是相當於
3 + (2 × 4) = 11
,如果你想要的答案是20,那麼你可以寫這個:
(3 + 2) × 4 = 20
同樣的事情會爲Ruby。如果沒有括號,第一行就相當於這個括號中的版本:
(a = str.reverse) if str.size > 3
這清楚地表明,該任務是什麼是條件把守,被分配不僅僅是值。
操作過程中括號會改變優先級。 由於其狀態爲條件表達式,括號之間的代碼將被評估爲布爾值。像@Mark Reed說的那樣,有不同的陳述。這取決於你打算使用正確的。希望它有幫助。 ;)
現在我明白了!謝謝Mark非常快速全面的回答:) – 2013-02-10 14:31:35