2012-01-12 122 views
1

我試圖找出是否有寫類似這樣的清潔方法:有沒有更好的方法來寫這種Ruby的條件?

if var1 == "hi" || var1 == "bye" || var1 == "well" || var1 == "hello" 
    puts var1 
end 

基本上,有一個變量,我想看看它是否等於幾個可能值之一。

我嘗試以下,但它是無效的:

if var1 == ("hi" || "bye" || "well" || "hello") 
    puts var1 
end 

回答

6
puts var1 if %w(hi bye well hello).include? var1 
+1

哇,真是太棒了!謝謝。對於任何未來發現這個問題的人來說,%w很難輸入到搜索引擎中,所以這裏是一個關於如何使用它們的相關問題的鏈接:http://stackoverflow.com/questions/4287503/where-in- -ruby-language-is-qw-etc-defined – jay 2012-01-12 22:22:04

+1

實際上%w不是解決方案的關鍵部分,它只是製作數組的另一種方法。 「['hi','bye','well','hello']。include?var1」會做同樣的事情。 – jrochkind 2012-01-13 15:54:38

1

如果列表更大,你要來檢查了很多,那麼你可以利用哈希節省一些時間:

want = Hash[%w{hi bye well hello}.map { |s| [ s, true ] }] 
puts var1 if(want[var1]) 

或一組:

want = Set[*%w{hi bye well hello}] # Or want = %w{...}.to_set 
puts var1 if want.include? var1 

構建哈希或集合是一次性命中,但檢查哈希將比使用include?掃描陣列快得多。如果有很多事情要檢查,或者如果你一遍又一遍地檢查,這種差異可能是值得的。

+1

通過編寫這個函數來設置[%w {hi bye well hello}]],Set只有一個值,數組本身就是這樣,代碼無法工作。也許%w {你好拜託hello} .to_set? – oldergod 2012-09-04 01:09:35

+1

@oldergod:我想我省略了一個圖示('Set [*%w {...}]'),但'to_set'也可以。感謝您的發現。 – 2012-09-04 01:46:36

相關問題