Was ist die kürzeste / idiomatischste Art zu bestimmen, ob eine Variable zu einer Liste von Werten gehört?

7

Das scheint eine lächerlich einfache Frage zu sein, aber was ist die kürzeste / idiomatische Art, dies in Ruby umzuschreiben?

%Vor%

Ich habe diese Lösung gesehen:

%Vor%

aber das ist nicht immer funktional gleichwertig - ich glaube, dass Array#include? tatsächlich nachsehen wird, ob das variable Objekt in der Liste enthalten ist; es berücksichtigt nicht, dass das Objekt seinen eigenen Gleichheitstest mit def ==(other) implementieren kann.

Wie von untenstehenden hilfreichen Kommentatoren festgestellt, ist diese Erklärung nicht korrekt. include? verwendet == , verwendet jedoch die Methode == der Elemente im Array. In meinem Beispiel sind es die Symbole und nicht die Methode == der Variablen. Das erklärt, warum es meinem ersten Codebeispiel nicht entspricht.

(Nehmen wir zum Beispiel% Mime::Type in%%: request.format == :html kann "true" zurückgeben, aber [:html].include?(request.format) gibt false zurück, da request.format eine Instanz von Mime :: Type ist, kein Symbol.)

Das Beste, was ich bisher habe, ist:

%Vor%

aber es scheint mir etwas umständlich. Hat jemand bessere Vorschläge?

    
NeilS 28.09.2009, 13:35
quelle

5 Antworten

15

Tatsächlich verwendet #include? == . Das Problem ergibt sich aus der Tatsache, dass wenn Sie

tun %Vor%

es überprüft :a == foo , nicht foo == :a . Das heißt, es verwendet die für die Objekte im Array definierte Methode == , nicht die Variable. Daher können Sie es verwenden, solange Sie sicherstellen, dass die Objekte im Array eine richtige == -Methode haben.

In Fällen, in denen dies nicht funktioniert, können Sie Ihre Aussage vereinfachen, indem Sie die select -Anweisung entfernen und den Block direkt an any übergeben:

%Vor%     
Pesto 28.09.2009, 13:56
quelle
3

Es sieht so aus, als ob Array#include? == verwendet:

%Vor%

Das erklärt auch die Array#include? -Dokumentation.

    
zgchurch 28.09.2009 13:52
quelle
1

Ich habe immer Ihr zweites Beispiel verwendet, if [:a, :b, :c, :d].include? variable . Während dies einige Probleme mit Klassen verursacht, die == überschreiben, ist es in den meisten Situationen völlig in Ordnung, in denen ich es benötigt habe (normalerweise gegen Symbole).

    
Matt Grande 28.09.2009 13:38
quelle
1

Wie wäre es mit:

%Vor%     
khelll 28.09.2009 13:42
quelle
0

Was Sie wirklich tun, ist zu sehen, ob die Variable ein Mitglied der Menge [:a,:b,:c,:d] ist, also semantisch, die der Methode include? zugeordnet ist.

Das Problem, auf das Sie stoßen, ist auf die Art der Duck-Typisierung von Ruby zurückzuführen. Wenn Sie also umgehen wollen, warum konvertieren Sie nicht zuerst in ein Symbol:

%Vor%     
ennuikiller 28.09.2009 13:50
quelle

Tags und Links