2013-10-02 44 views
1

如果我有多個||邏輯運算符我想在Ruby中鏈,有沒有更好的方式來寫它比這Ruby ||運算符快捷鍵

if (((a == 1 || a == 9) || a % 5 == 0) || ...) 

這完全是非常重複和不潔淨的。

+1

你在說多少? 10? 100? – Larsenal

+4

您也可以將其重構爲語義有意義的可測試方法。 –

+1

'[1,9] .include?一個'可以代替前兩個'||'表達式。還有'case'語句可以讓你多行傳播的東西,等 –

回答

6

如果你已經是手術室,你不需要括號...

(a == 1 || a == 9 || a % 5 == 0) 

清理了一點東西。

Ruby是一個有趣的語言。可能有許多聰明的方式可以用不那麼重複的方式表達同樣的意圖。我只是謹慎地避免簡潔而非簡單。如果你真的只是尋找一個列表中匹配

include?是適當的。但是,如果這不是最適合表達它的方式,則不要保存幾個字符。

1

什麼是整個語句?如果你正在尋找各種方法來壓縮數學比較弄成短(如

puts 'hi' if a & ~8 == 1 || a % 5 == 0 

如果有條件的身體是一個單獨的語句,例如,你不需要任何括號&〜8 == 1,這與a == 1 || a == 9相同)然後發佈整個事情。有些人喜歡這樣的事情。 :)

4

你可以把你的布爾語句到一個數組中,並調用#任何?對此:

if [a == 1, a == 9, a % 5 == 0, ...].any? 

這看起來可讀性更強一點,但這肯定取決於您的用例。

0

如果你有很多的||的,

t = [" == 1", " == 9", "%5==0"] or 
t = %w[==1 ==9 %5==0] # No spaces other than separators! or 
t = "==1 ==9 %5==0".split # Ditto! or 
t = "== 1, == 9, %5==0".split(',') 

然後

t.inject (false) {|r, s| r || eval('a'+s) } 

如果你有很多很多的||的,你可以做這樣的事情之前inject ING:

assignments = [1, 2, 5, ":cat", "dog",...] 
other = "%5==0, & 8,...".split(',') 
t = assignments.map {|e| "=="+e.to_s} + other 
+0

我不介意downvotes,但我討厭給予沒有解釋的downvotes!我想知道爲什麼,所以我可以改善。哎呀。 –