2010-02-01 33 views
67

是否有一個紅寶石成語爲「如果做這個」,「做這個」就像一個簡單的命令?紅寶石三元運算符沒有其他

例如,我正在做

object.method ? a.action : nil 

離開else子句空的,但是我覺得有可能這樣做的更地道的方式,不涉及在指定爲零結束。 (和或者,我覺得佔用了多行代碼會在這種情況下浪費。

+0

這取決於上下文,但有時它更優雅讀的,如果/當/在身體比只有一個行開始塊更密集/更簡潔的東西。 – 2010-02-01 16:29:12

回答

105
a.action if object.method? 
14

Greg的回答是最好的,但備案,而且比用C甚至更多,表達式和語句是等價的在Ruby中,所以除了a.action if o.m?你也可以做這樣的事情:

object.method? && a.action 

你可以寫(a; b; c) if d甚至

(a 
b 
c 
) if d 

或爲磨砂R:(x; y; z) ? (a; b c) : (d; e; f)

有Ruby中沒有情況下只有一個語句或表達被允許...

131

作爲一般規則:你很可能永遠不需要在Ruby中三元運算符。之所以你在C中需要它,是因爲在C if是一個語句,所以如果你想返回一個值你有使用三元運算符,這是一個表達式。

在Ruby中,一切是一個表達式,有沒有報表,這使得三元操作幾乎是多餘的。您可以隨時更換

cond ? then_branch : else_branch 

if cond then then_branch else else_branch end 

所以,在你的榜樣:

object.method ? a.action : nil 

相當於

if object.method then a.action end 

其作爲@格雷格·坎貝爾指出的是反過來相當於尾隨的if修飾形式

a.action if object.method 

而且,由於在Ruby中的布爾運算符不只是返回truefalse,但最後計算表達式的值,你可以用它們來控制數據流。這是在Perl進口一個習慣用法,是這樣的:

object.method and a.action 
+12

這是一個偉大的答案! – 2012-01-11 00:25:08

+5

三元運算符'cond? a:b'短於'如果cond然後是另一個b end',那隻能讓我用它來保存11個字符;-) – Markus 2014-02-03 11:58:40

+0

[Ruby Style Guide](https://github.com/bbatsov/ruby-style) -guide#ternary-operator)指出:「通過'if/then/else/end'構造三元運算符('?:'),這更爲常見,顯然更簡潔。 – 2016-04-18 09:13:51

2

result = (<expression> && <true value>) || <false value>

value = 1 result = (value == 1 && 'one') || 'two' result #=> 'one' 說明:值== 1 & & '一' #=>返回最後一個表達式的結果,值是平等1所以部分將被評估,並返回'一'。

value = 0 result = (value == 1 && 'one') || 'two' result #=> 'two'

解釋:值= 1,「和」表達不會被評估,但instad將被使用「或」表達和它返回「二」

0

的另一種方法可以做到這一點在同一行是:

if object.method; a.action end 

這被認爲是不好的風格深受Rubocop,因爲它使用一個分號終止的表情,但我覺得它不是跟蹤末尾的if語句一些條件更具有可讀性。在最後忽略if語句更容易,如果條件不成立,我並不總是想要返回某些東西(因爲您被迫與三元運算符一起使用)。

也可以是一個更有點冗長和rubocop友好:

if object.method then a.action end