在Ruby中如何使用條件運算符(? :
)?如何在Ruby中使用條件運算符(?:)?
例如,這是正確的嗎?
<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %>
在Ruby中如何使用條件運算符(? :
)?如何在Ruby中使用條件運算符(?:)?
例如,這是正確的嗎?
<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %>
它是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? 2:3也給出了2。這是爲什麼? – 2014-07-09 15:23:57
@X_Trust在Ruby中,唯一的falsy值是`nil`和`false`。確實不是很常見。 – Kroltan 2014-07-25 14:04:08
puts true ? "true" : "false"
=> "true"
puts false ? "true" : "false"
=> "false"
@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
遭受了。
您對ERB的使用表明您在使用Rails。如果是這樣,那麼考慮truncate
,一個內置的輔助這會爲你做的工作:
<% question = truncate(question, :length=>30) %>
這方面的一個小變化是使用轉換爲Boolean!運營商這樣
result = !!(condition == true)
一個簡單的例子,其中運營商檢查玩家的ID爲1,並且設置敵人ID根據結果
player_id=1
....
player_id==1? enemy_id=2 : enemy_id=1
# => enemy=2
而且我發現一個post即將這似乎非常有益的話題。
是的,我認爲,但我也認爲你可以通過以下方式實現:`question = question [0,20]如果它小於20,它不會改變它。 – DGM 2010-11-23 05:06:31
如果長度大於20,我還需要添加'...' – 2010-11-23 05:32:28
要小心地在給定列處切斷一條線。您最終可能會在中途刪減一個詞,然後添加elipsis('...'),這看起來很糟糕。相反,請查找附近的標點符號或空白字符,並在那裏截斷。只有在附近沒有更好的突破點的情況下,才能截斷中間詞。 – 2010-11-23 06:11:32