2010-06-21 116 views

回答

55

then是一個分隔符,以幫助確定紅寶石的條件和表達的真正部分。 除非你想在一行寫一個if表達

if條件then真一部分else假一部分end

then是可選的。對於如果其他終端跨越多行換行作爲分隔符從真實部分

# can't use newline as delimiter, need keywords 
puts if (val == 1) then '1' else 'Not 1' end 

# can use newline as delimiter 
puts if (val == 1) 
    '1' 
else 
    'Not 1' 
end 
+1

在Ruby中,'if'是表達式,而不是語句。事實上,* everything *是一個表達式,沒有語句。因此,你的兩個例子最好寫成'puts if val == 1 then'1'else'Not 1'end'。 – 2010-06-21 11:31:36

+3

@Jorg - 沒錯。我需要花費一些時間來清理C年。 :) – Gishu 2010-06-21 12:20:49

+1

在ruby 2.1.2中,'puts if(1 == 1)then'1'else'not 1'end'會產生一個'語法錯誤,意外的關鍵字_然後,期待輸入結束',除非你把if括號中的語句'puts(if(1 == 1)then'1'else'not 1'end)'。 – Sam 2015-10-12 14:22:37

1

有沒有什麼不同。

而且,僅供參考,您的代碼進行優化,以

something.meth(val == 'hi' ? 'hello' : 'right') 
+12

縮短,而不是「優化」? – Douglas 2010-06-21 09:59:44

+4

更短,但不太清楚。我從來沒有在快速原型之外使用這種結構。 – Blixxy 2013-10-02 11:35:34

5

,如果你想要寫在一行中if表達的then只需要拆分條件:

if val == "hi" then something.meth("hello") 
else something.meth("right") 
end 

您示例中的括號不重要,您可以跳過它們。

詳情請參閱Pickaxe Book

9

下面是一個與您的問題沒有直接關係的快速提示:在Ruby中,沒有像if這樣的語句。事實上,在Ruby中,沒有任何聲明在所有全部是一個表達式。 if表達式返回在分支中執行的最後一個表達式的值。

所以,沒有必要寫

if condition 
    foo(something) 
else 
    foo(something_else) 
end 

這將更好地寫成

foo(
    if condition 
    something 
    else 
    something_else 
    end 
) 

或者作爲一個班輪

foo(if condition then something else something_else end) 

在您的例子:

something.meth(if val == 'hi' then 'hello' else 'right' end) 

注意:Ruby也有一個三元運算符(condition ? then_branch : else_branch),但這是完全不必要的,應該避免。 C語言需要三元運算符的唯一原因是因爲在C if中是一條語句,因此無法返回值。您需要三元運算符,因爲它是一個表達式,並且是從條件返回值的唯一方法。但在Ruby中,if已經是一個表達式,所以實際上不需要三元運算符。

+5

在Ruby中,有很多方法可以達到同一個目標。我個人喜歡三元運算符。我發現它緊湊且易讀:) – nathanvda 2010-06-21 13:25:55

+0

我們在構建系統中廣泛使用ruby,我發現第一種語法對於來自其他語言的開發人員更容易理解。 – 2015-07-21 20:41:18