Cuál es la diferencia entre
case item.class
when MyClass
# do something here
when Array
# do something different here
when String
# do a third thing
end
y
case item.class
when MyClass.class
# do something here
when Array.class
# do something different here
when String.class
# do a third thing
end
Por alguna razón, el primero de estos funciona a veces y el segundo no, y otras veces, el segundo funciona y el primero no. ¿Por qué? ¿Cuál es la forma "adecuada" de hacerlo?
ruby
duck-typing
case-statement
Daisy Sophia Hollman
fuente
fuente
MyClass === obj
utiliza el método Módulo # === para verificar siobj
es una instancia deMyClass
.Respuestas:
Debes usar:
Tuve el mismo problema: ¿Cómo atrapar Errno :: clase ECONNRESET en "caso cuando"?
fuente
Sí, Nakilon es correcto, debe saber cómo funciona el operador threequal === en el objeto dado en la
when
cláusula. En rubírealmente es
Comprenda que case llama a un método threequal (
MyClass.===(item)
por ejemplo), y ese método se puede definir para hacer lo que quiera, y luego puede usar la declaración de caso con precisiónwfuente
arr = []
, noté queif Array === arr
se evaluará como verdadero peroif arr === Array
se evaluará como falso. ¿Alguien puede ayudarme a explicar?Puedes usar:
... cuando el siguiente giro no es posible:
La razón de esto es que
case
usa===
, y la relación===
que describe el operador no es conmutativa . Por ejemplo,5
es unInteger
, pero esInteger
un5
? Así es como debes pensar encase
/when
.fuente
En Ruby, un nombre de clase es una constante que se refiere a un objeto de tipo
Class
que describe una clase en particular. Eso significa que decirMyClass
en Ruby es equivalente a decirMyClass.class
en Java.obj.class
es un objeto de tipo queClass
describe la clase deobj
. Siobj.class
es asíMyClass
,obj
se creó usandoMyClass.new
(aproximadamente).MyClass
es un objeto de tipoClass
que describe cualquier objeto creado usandoMyClass.new
.MyClass.class
es la clase delMyClass
objeto (es la clase del objeto de tipoClass
que describe cualquier objeto creado usandoMyClass.new
). En otras palabras,MyClass.class == Class
.fuente
Depende de la naturaleza de su
item
variable. Si es una instancia de un objeto, p. Ej.luego
pero si es una clase en sí misma, por ejemplo
entonces será un
Class
objeto, entoncesEDITAR : consulte Cómo capturar la clase Errno :: ECONNRESET en "caso cuando"? como dijo Nakilon ya que mi respuesta podría estar equivocada.
fuente