2013-02-10 45 views
1



我正在學習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 

有人可以告訴我這些括號中的返回值的變化?
這是一種「塊」的代碼?

回答

7

它們是兩種不同的陳述。

第一種是有條件分配:

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 

這清楚地表明,該任務是什麼是條件把守,被分配不僅僅是值。

+0

現在我明白了!謝謝Mark非常快速全面的回答:) – 2013-02-10 14:31:35

0

操作過程中括號會改變優先級。 由於其狀態爲條件表達式,括號之間的代碼將被評估爲布爾值。像@Mark Reed說的那樣,有不同的陳述。這取決於你打算使用正確的。希望它有幫助。 ;)

相關問題