Was ist der Unterschied zwischen
case item.class
when MyClass
# do something here
when Array
# do something different here
when String
# do a third thing
end
und
case item.class
when MyClass.class
# do something here
when Array.class
# do something different here
when String.class
# do a third thing
end
Aus irgendeinem Grund funktioniert die erste manchmal und die zweite nicht, und manchmal funktioniert die zweite und die erste nicht. Warum? Welches ist der "richtige" Weg, es zu tun?
ruby
duck-typing
case-statement
Daisy Sophia Hollman
quelle
quelle
MyClass === obj
die Methode Module # === verwendet wird, um zu überprüfen, obobj
es sich um eine Instanz von handeltMyClass
.Antworten:
Sie müssen verwenden:
Ich hatte das gleiche Problem: Wie fange ich die Errno :: ECONNRESET-Klasse in "case when" ab?
quelle
Ja, Nakilon ist richtig. Sie müssen wissen, wie der Operator threequal === für das in der
when
Klausel angegebene Objekt funktioniert . In Rubyist wirklich
Verstehen Sie, dass case eine dreifache Methode aufruft (
MyClass.===(item)
zum Beispiel), und dass diese Methode definiert werden kann, um zu tun, was Sie wollen, und dann können Sie die case-Anweisung mit präzise W verwendenquelle
arr = []
dann habe ich bemerkt, dassif Array === arr
das als wahr, aberif arr === Array
als falsch bewertet wird. Kann mir bitte jemand helfen zu erklären?Sie können verwenden:
... wenn folgende Drehung nicht möglich ist:
Der Grund dafür ist, dass
case
verwendet===
wird und die vom===
Operator beschriebene Beziehung nicht kommutativ ist . Ist zum Beispiel5
einInteger
, aber istInteger
ein5
? So sollten Sie sichcase
/ vorstellenwhen
.quelle
In Ruby ist ein Klassenname eine Konstante, die sich auf ein Objekt vom Typ bezieht
Class
, das eine bestimmte Klasse beschreibt. Das bedeutet, dass das SprichwortMyClass
in Ruby dem SprichwortMyClass.class
in Java entspricht.obj.class
ist ein Objekt vom TypClass
, das die Klasse von beschreibtobj
. Wennobj.class
jaMyClass
, dannobj
wurde mitMyClass.new
(grob gesagt) erstellt.MyClass
ist ein Objekt vom TypClass
, das jedes Objekt beschreibt, das mit erstellt wurdeMyClass.new
.MyClass.class
ist die Klasse desMyClass
Objekts (es ist die Klasse des Objekts vom TypClass
, die jedes Objekt beschreibt, das mit erstellt wurdeMyClass.new
). Mit anderen WortenMyClass.class == Class
.quelle
Dies hängt von der Art Ihrer
item
Variablen ab. Wenn es sich um eine Instanz eines Objekts handelt, zdann
aber wenn es eine Klasse für sich ist, z
dann wird es ein
Class
Objekt sein, alsoBEARBEITEN : Bitte lesen Sie Wie man die Errno :: ECONNRESET-Klasse in "case when" abfängt. wie von Nakilon angegeben, da meine Antwort falsch sein könnte.
quelle