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 === objutiliza el método Módulo # === para verificar siobjes 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
whenclá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 === arrse evaluará como verdadero peroif arr === Arrayse evaluará como falso. ¿Alguien puede ayudarme a explicar?Puedes usar:
... cuando el siguiente giro no es posible:
La razón de esto es que
caseusa===, y la relación===que describe el operador no es conmutativa . Por ejemplo,5es unInteger, pero esIntegerun5? 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
Classque describe una clase en particular. Eso significa que decirMyClassen Ruby es equivalente a decirMyClass.classen Java.obj.classes un objeto de tipo queClassdescribe la clase deobj. Siobj.classes asíMyClass,objse creó usandoMyClass.new(aproximadamente).MyClasses un objeto de tipoClassque describe cualquier objeto creado usandoMyClass.new.MyClass.classes la clase delMyClassobjeto (es la clase del objeto de tipoClassque describe cualquier objeto creado usandoMyClass.new). En otras palabras,MyClass.class == Class.fuente
Depende de la naturaleza de su
itemvariable. Si es una instancia de un objeto, p. Ej.luego
pero si es una clase en sí misma, por ejemplo
entonces será un
Classobjeto, entoncesEDITAR : consulte Cómo capturar la clase Errno :: ECONNRESET en "caso cuando"? como dijo Nakilon ya que mi respuesta podría estar equivocada.
fuente