2010-07-12 60 views
4

我喜歡明智地使用三元條件運算符。在我看來,它非常簡潔。ruby​​ idiom:謂詞和條件運算符

然而,在Ruby中,我發現我經常測試斷言方法,這已經有了自己的問號:

some_method(x.predicate? ? foo : bar) 

我被這兩個問題震動標誌着如此接近對方。是否有一個等效的緊湊和可讀的替代方案?

回答

8

最近的簡潔表達,你可以得到的是

x.predicate? && foo || bar 

作用不大不小的三元運算符的,但更多的神祕和醜陋。

這只是造成對query?方法的語法糖糖尿病的情況。我想我們必須學會忍受它。

+0

+ 1爲隱晦++和醜++。 – pilcrow 2010-07-13 14:17:55

+0

+1,因爲這對Ruby來說更自然。你的三元運算符是一種可以說更加神祕的創新,而使用&&和||反對錶達式是合乎邏輯的,因爲我們知道Ruby表達式總是返回值,因此代碼就是它的意思。 – exiquio 2013-04-29 01:23:06

11

爲什麼需要在C條件運算符的原因,是因爲條件語句,以及,一個聲明,即它不會(也不能)返回一個值。所以,如果你想從條件代碼中返回一個值,那你的運氣不好。這就是爲什麼必須添加條件運算符的原因:它是一個表達式,即它返回一個值。

在Ruby中,但是,因爲沒有報表中的Ruby反正有條件的經營者完全是多餘的。 全部是一個表達式。具體來說,Ruby中沒有if語句,只有if表達式。

而且由於if是一種表達,無論如何,你可以用它代替了神祕的條件運算符:

some_method(if x.predicate? then foo else bar end) 

你要記住的唯一的事情是,謂詞需要通過任何一個換行符結束,分號或then。所以,你做第一個三次,你會變成

if cond 
    foo 
else 
    bar 
end 

if cond foo else bar end 

,不知爲什麼它不工作。但在那之後,該then(或分號)自然會到來:

if cond; foo else bar end 
if cond then foo else bar end 
+3

我upvoted,但真的嗎?神祕?我不認爲任何程序員會發現條件運算符是神祕的,而且我個人更希望在方法調用中看到「如果條件結束」。 – 2010-07-12 20:01:57

+0

+1代表'then' /';'對話務員的評論和討論。 – pilcrow 2010-07-13 14:16:00

+0

+1,因爲我認爲這比「謂詞?」更具可讀性。實施 – 2011-07-27 21:24:42

3

只要刪除空間。

some_method(x.predicate?? foo : bar) 

在Ruby中同樣有效。嘗試一下!

+3

+1我不喜歡它 - 看起來太像錯字的線 - 但它是一個可行的選擇。 (有趣的是,如果你通過後空翻來定義一個方法'predicate?'[原文如此,Ruby仍然會將上述內容解析爲調用'謂詞?'。) – pilcrow 2012-05-16 13:33:48

1

不能說這是比較容易的,但在許多情況下,它可能是有用的來包裝自己謂詞放在括號中,類似這樣的:

some_method((x.predicate?) ? foo : bar) 

有幫助,尤其是當你的謂詞並不象method?那樣簡單