2012-04-02 6 views
2

Ich brauche die folgende Logik. Wenn das Array value enthält, gebe es andernfalls einen Standardwert zurück. Bisher habe ich festgestellt dies kann durch delete Verwendung erreicht werden:Array holen oder Standardfunktion

array.delete(value) || default_value 

Aber offensichtlich es ändert das Array. Gibt es eine ähnliche Funktion wie fetch mit Standard, die ein Element anstelle eines Indexes nimmt?

PS. Ich weiß, dass dies als array.include?(value) ? value : default_value umgeschrieben werden kann, ist die Frage nur für saubereren Code.

+1

Ich fürchte, Sie nicht einfachen Code für diesen (letztere) finden werden, was bedeutet, Sie müssen Implementieren Sie Ihr eigenes 'fetch', das diese Komplexität verbirgt :-) Alternative (wenn der Standardwert '6' ist):' ary.find (lambda {6}) {| x | x == 6} ' – karatedog

Antwort

4

Update: Es ist eine Möglichkeit, die ich denken kann, aber das ist härter als das ternäre zu lesen:

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

Sie könnten Affen Patch, der in Array wenn Sie so geneigt sind:

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

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

Alte Antwort, bevor ich erkannte, dass Sie den Wert für die Suche verwenden möchten, nicht den Index:

Array#fetch nimmt ein optionales zweites Argument:

array.fetch(index, default) 

Hier ein Beispiel:

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

Er möchte nicht den Index angeben. Er möchte wissen, ob ein Array einen Wert enthält, und dann den Wert zurückgeben. Andernfalls wird der Standardwert zurückgegeben. – karatedog

Verwandte Themen