2012-04-30 6 views
3

複数のORを持つ条件があるとします。Ruby - オブジェクトがリストに含まれているかどうかを判断するための代替スタイル?

if ['new', 'edit', 'action'].include?(action) 

が、それはロジックを作成するために「後方」の方法のように感じている:

if action == 'new' || action == 'edit' || action == 'update' 

これを書くための別の方法はあります。

if action.equals_any_of?('new', 'edit', 'action') 

のような何かを行うには任意の組み込みの方法はありますか?

アップデート - 私はこの小さなスニペットにかなり夢中だ:

class Object 
    def is_included_in?(a) 
    a.include?(self) 
    end 
end 

アップデート2 - 以下のコメントをもとに改善点:

class Object 
    def in?(*obj) 
    obj.flatten.include?(self) 
    end 
end 
+0

私はRubyデベロッパーではありませんが、私は2番目のものが好きです(私はJavaScriptでこれをやっています)。 –

+0

恐らく 'is_included_in?(* a)'はエラーをより確実にするでしょう。 –

+1

ええ、それは便利ですが、私は通常、短い「Object#in?」を書いています:http://stackoverflow.com/a/4421030/188031 – tokland

答えて

5

は、正規表現を使用しますか?

action =~ /new|edit|action/ 

または:

action.match /new|edit|action/ 

それとも、あなたのアプリケーションのコンテキストで意味的に意味のあるのシンプルなユーティリティメソッドを記述します。

+0

私はこれが好きです。もし私が文字列を扱っていたら、これを使うでしょう。他のオブジェクトのために簡潔なものがあったらいいのに。 –

+0

@AndyWaiteアプリケーション固有のオブジェクト(質問からはっきりしない)を扱う場合、アプリにとって意味のある「単純なユーティリティメソッド」が最適です。 –

1

あなたは文字列の配列のため%w表記を使用することができます。

%w(new edit action).include? action 
+0

ええ、それでもまだ後方にある、つまり、その行の目的をどのように記述するのかとは逆のように見えます。 –

5

さらに別の方法は、あなたはまた、この

if action =~ /new|edit|action/ 
のような場合のために、正規表現を使用することができます

case action 
when 'new', 'edit', 'action' 
    #whatever 
end 

だろう

+0

regexesは動作しますが、 'case'ははるかに汎用性があります。 +1。 – Linuxios

+0

少し冗長ですが、状況によっては良いと思います。 –

関連する問題