2012-01-12 5 views
1

この種のRubyの条件を記述するためのよりクリーンな方法がありますか?私はこのような何かを書くためのクリーンな方法がありますかどうかを確認しようとしている

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

は基本的には、一つの変数がありますし、私はそれはいくつかの可能な値の1に等しいだかどうかを確認します。

私は次のことを試してみましたが、それは無効でした:

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

+1

実際%wはソリューションの重要な部分ではありませんが、これは配列を作るもう一つの方法です。 "['hi'、 'bye'、 'well'、 'hello'] .include?var1は同じことをします。 – jrochkind

1

リストは大きいですし、あなたがそれをたくさんチェックするつもりなら、あなたはハッシュを使って、いくつかの時間を節約することができます:

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

またはSet:

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

ハッシュまたはセットを構築することは一度だけのヒットですが、ハッシュをチェックするほうがアレイをスキャンするほうが、include?のほうがずっと速くなります。チェックするべきことがたくさんある場合や、何度も何度もチェックしている場合は、その違いが価値があるかもしれません。

+1

これを書いて[%w {こんにちはこんにちは}]に設定すると、Setは配列自体が1つしかないので、コードは機能しません。たぶん%w {こんにちはこんにちは} .to_set? – oldergod

+1

@oldergod:私はスプラット( 'Set [*%w {...}]')を省略したと思いますが、 'to_set'も同様に機能します。それを見つけていただきありがとうございます。 –

関連する問題