2012-04-02 16 views
2

以下のロジックが必要です。配列にvalueが含まれている場合はそれを返し、それ以外の場合はデフォルト値を返します。これまでのところ、私はこれがdeleteを用いることによって達成することができることがわかりました。配列フェッチまたはデフォルト関数

array.delete(value) || default_value 

しかし、明らかに、それは、配列を変更します。 fetchのような同じ機能があり、インデックスの代わりに要素をとるデフォルトがありますか?

PS。私はこれがarray.include?(value) ? value : default_valueと書かれていることを知っています。問題はちょうどクリーナーコードのためです。

+1

私はあなたがしなければならないことを意味これは、このための任意のシンプルなコード(後者を)見つけることができません怖いですその複雑さを隠す独自の 'fetch'を実装してください:-) 代替(デフォルトが' 6'の場合): 'ary.find(lambda {6}){| x | x == 6} ' – karatedog

答えて

4

更新:あり私は考えることができる一つの方法だが、それは三元よりも読むのが大変です。

(array & [value]).first || default_value 

あなたは可能性があなたがそう傾斜している場合Arrayに猿パッチ:

class Array 
    def fetch_value(value, default) 
    (self & [value]).first || default 
    end 
end 

a = *1..3 
a.fetch_value(4, "foo") 
#=> "foo" 
は、

以前の回答では、インデックスではなくルックアップの値を使用したいと思います。

Array#fetchオプションの第二引数を取ります:

array.fetch(index, default) 

はここに例を示します

a = *1..3 
a.fetch(4, "foo") 
#=> "foo" 
+0

彼は' index'を指定したくありません。 Arrayに値が含まれているかどうかを知りたい場合は、その値を返し、そうでない場合はデフォルト値を返します。 – karatedog

関連する問題