2012-12-12 60 views
21

隨着紅寶石三元運營商,我們可以寫出下面的邏輯簡單if else結構:Ruby if if ... elsIf .. else在單行上?

a = true ? 'a' : 'b' #=> "a" 

但如果我想寫這是if foo 'a' elsif bar 'b' else 'c'什麼?

我可以寫爲以下,但它是一個有點難以遵循:

foo = true 
a = foo ? 'a' : (bar ? 'b' : 'c') #=> "a" 

foo = false 
bar = true 
a = foo ? 'a' : (bar ? 'b' : 'c') #=> "b" 

是否有處理這種情況下任何更好的選擇,或者這是我們最好的選擇,如果我們希望凝聚如果。 .elsif ..使邏輯成一行?

+3

我認爲嵌套三元解決方案缺乏可讀性的問題在於,將所有這些放在一行上本質上難以閱讀,而且您提出的任何解決方案都將更容易解析。 –

+5

換句話說,憑藉更多的經驗,您將會了解到儘可能多地將代碼擠入儘可能小的空間永遠不是一個有效的目標。 –

+3

「將盡可能多的代碼擠入儘可能小的空間永遠不是一個有效的目標。」除了機器碼。 –

回答

43
a = (foo && "a" or bar && "b" or "c") 

a = ("a" if foo) || ("b" if bar) || "c" 
+1

感興趣的回答,Sawa。這是使用'或'優先級作爲一個技巧嗎? – sunnyrjuneja

+2

'或'和'和'具有比'&&'和'||'更低的關聯性。 – sawa

+2

我喜歡這個......只要你學習優先順序,''和'和'或'是朋友,每個人都應該這樣做。 –

3

你也可以這樣寫:

x = if foo then 'a' elsif bar then 'b' else 'c' end 

然而,這是不是在Ruby中慣用的格式。

5

a = if foo then 'a' elsif bar then 'b' else 'c' end

12

Github Ruby Styleguide建議一個襯墊用於瑣碎保留如果被避免/ else語句和嵌套三元運算符。你可以使用then關鍵字,但它被認爲是不好的做法。

if foo then 'a' elsif bar then 'b' else 'c' end 

如果發現你的控制語句過於複雜,你可以使用case(ruby的switch操作符)。

+1

'if foo then'a'elsif bar then'b'else'c'' 沒有必要在酒吧後面用分號 – UsamaMan

+0

感謝您的建議,現在編輯刪除它 – sunnyrjuneja

+1

我忘了'end在'c'之後。我們也需要補充一點。 – UsamaMan