Quelle est la différence entre
case item.class
when MyClass
# do something here
when Array
# do something different here
when String
# do a third thing
end
et
case item.class
when MyClass.class
# do something here
when Array.class
# do something different here
when String.class
# do a third thing
end
Pour une raison quelconque, le premier de ces travaux fonctionne parfois et le second ne fonctionne pas, et d'autres fois, le second fonctionne et le premier ne fonctionne pas. Pourquoi? Quelle est la «bonne» façon de le faire?
ruby
duck-typing
case-statement
Daisy Sophia Hollman
la source
la source
MyClass === obj
utilise la méthode Module # === pour vérifier s'ilobj
s'agit d'une instance deMyClass
.Réponses:
Tu dois utiliser:
J'ai eu le même problème: Comment attraper la classe Errno :: ECONNRESET dans "cas quand"?
la source
Ouais, Nakilon a raison, vous devez savoir comment l'opérateur threequal === fonctionne sur l'objet donné dans la
when
clause. En rubisest vraiment
Comprenez que case appelle une méthode threequal (
MyClass.===(item)
par exemple), et que cette méthode peut être définie pour faire ce que vous voulez, puis vous pouvez utiliser l'instruction case avec precisionwla source
arr = []
j'ai remarqué queif Array === arr
cela évaluera à vrai maisif arr === Array
évaluera à faux. Quelqu'un peut-il s'il vous plaît aider à expliquer?Vous pouvez utiliser:
... lorsque la torsion suivante n'est pas possible:
La raison en est que
case
utilise===
, et la relation===
décrite par l' opérateur n'est pas commutative . Par exemple,5
est unInteger
, mais estInteger
un5
? C'est ainsi que vous devriez penser àcase
/when
.la source
Dans Ruby, un nom de classe est une constante qui fait référence à un objet de type
Class
qui décrit une classe particulière. Cela signifie que direMyClass
en Ruby équivaut à direMyClass.class
en Java.obj.class
est un objet de typeClass
décrivant la classe deobj
. Siobj.class
estMyClass
, alors aobj
été créé en utilisantMyClass.new
(grosso modo).MyClass
est un objet de typeClass
qui décrit tout objet créé à l'aide deMyClass.new
.MyClass.class
est la classe de l'MyClass
objet (c'est la classe de l'objet de typeClass
qui décrit tout objet créé à l'aide deMyClass.new
). En d' autres termes,MyClass.class == Class
.la source
Cela dépend de la nature de votre
item
variable. S'il s'agit d'une instance d'un objet, par exemplepuis
mais si c'est une classe en soi par exemple
alors ce sera un
Class
objet, doncEDIT : veuillez vous référer à Comment attraper la classe Errno :: ECONNRESET dans "cas quand"? comme indiqué par Nakilon puisque ma réponse pourrait être fausse.
la source