2010-11-23 55 views
218

在Ruby中如何使用條件運算符(? :)?如何在Ruby中使用條件運算符(?:)?

例如,這是正確的嗎?

<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %> 
+1

是的,我認爲,但我也認爲你可以通過以下方式實現:`question = question [0,20]如果它小於20,它不會改變它。 – DGM 2010-11-23 05:06:31

+0

如果長度大於20,我還需要添加'...' – 2010-11-23 05:32:28

+1

要小心地在給定列處切斷一條線。您最終可能會在中途刪減一個詞,然後添加elipsis('...'),這看起來很糟糕。相反,請查找附近的標點符號或空白字符,並在那裏截斷。只有在附近沒有更好的突破點的情況下,才能截斷中間詞。 – 2010-11-23 06:11:32

回答

358

它是ternary operator,它的工作方式與C相同(不需要括號)。它像工作的表達式:

if_this_is_a_true_value ? then_the_result_is_this : else_it_is_this 

然而,在Ruby中,if也是一種表達這樣:除了優先問題if a then b else c end === a ? b : c。兩者都是表達式。

例子:

puts (if 1 then 2 else 3 end) # => 2 

puts 1 ? 2 : 3    # => 2 

x = if 1 then 2 else 3 end 
puts x      # => 2 

注意的是,在第一種情況下括號是必需的(否則紅寶石困惑,因爲它認爲它是puts if 1與後一些額外的垃圾),但他們沒有在過去的情況下所需因爲這個問題沒有出現。

您可以使用「長,如果」形式可讀性多行:

question = if question.size > 20 then 
    question.slice(0, 20) + "..." 
else 
    question 
end 
+0

放0? 2:3也給出了2。這是爲什麼? – 2014-07-09 15:23:57

+10

@X_Trust在Ruby中,唯一的falsy值是`nil`和`false`。確實不是很常見。 – Kroltan 2014-07-25 14:04:08

26
puts true ? "true" : "false" 
=> "true" 


puts false ? "true" : "false" 
=> "false" 
14

@pst給予了極大的答案,但我想提一提,在Ruby中三元運算符寫在一行是語法正確的,不像Perl和C,其中,我們可以把它寫在多行:

如果你嘗試將其分解成多行
(true) ? 1 : 0 

通常紅寶石會產生一個錯誤,但你可以使用在一行的末尾和Ruby續行符號將竭誠:

(true) \ 
    ? 1 \ 
    : 0 

這是一個簡單的例子,但較長線處理,因爲它使代碼很好的佈局時,它可以是非常有用的。

它也可以通過把最後的運營商上線使用不續行字符三元,但我不喜歡或不推薦它:

(true) ? 
    1 : 
    0 

我認爲,導致真的很難當條件測試和/或結果變得更長時讀取代碼。

我讀過評論說不使用三元運算符,因爲它很混亂,但這是不使用某些東西的壞理由。通過相同的邏輯,我們不應該使用正則表達式,範圍運算符('..'和看似未知的「觸發器」變體)。它們在正確使用時功能強大,所以我們應該學會正確使用它們。


你爲什麼把括號true

考慮OP的例子:

<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %> 

結束語條件測試有助於增強可讀性,因爲它在視覺上分離的測試:

<% question = (question.size > 20) ? question.question.slice(0, 20)+"..." : question.question %> 

當然,整個例如可以作出通過使用一些明智的空白添加,可讀性更高。這是未經測試,但你會得到的想法:

<% question = (question.size > 20) ? question.question.slice(0, 20) + "..." \ 
            : question.question 
%> 

或者,更寫了地道:

<% question = if (question.size > 20) 
       question.question.slice(0, 20) + "..." 
       else 
       question.question 
       end 
%> 

它會很容易的論點,即從可讀性嚴重question.question遭受了。

23

您對ERB的使用表明您在使用Rails。如果是這樣,那麼考慮truncate,一個內置的輔助這會爲你做的工作:

<% question = truncate(question, :length=>30) %> 
0

這方面的一個小變化是使用轉換爲Boolean!運營商這樣

result = !!(condition == true) 
2

一個簡單的例子,其中運營商檢查玩家的ID爲1,並且設置敵人ID根據結果

player_id=1 
.... 
player_id==1? enemy_id=2 : enemy_id=1 
# => enemy=2 

而且我發現一個post即將這似乎非常有益的話題。