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?
Tatsächlich verwendet #include?
==
. Das Problem ergibt sich aus der Tatsache, dass wenn Sie
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:
Es sieht so aus, als ob Array#include?
==
verwendet:
Das erklärt auch die Array#include?
-Dokumentation.
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).
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%