Me gustaría probar si una clase hereda de otra clase, pero no parece existir un método para eso.
class A
end
class B < A
end
B.is_a? A
=> false
B.superclass == A
=> true
Una implementación trivial de lo que quiero sería:
class Class
def is_subclass_of?(clazz)
return true if superclass == clazz
return false if self == Object
superclass.is_subclass_of?(clazz)
end
end
pero esperaría que esto ya exista.
ruby
inheritance
subclass
superclass
Confusión
fuente
fuente

A.class #=> Class. Es por eso queB.is_a? Adevuelve falso.kind_of?kind_of?prueba si un objeto es una instancia de una clase. No si el objeto hereda de una clase.kind_of?es un alias deis_a?Respuestas:
Solo usa el
<operadoro usar el
<=operadorfuente
is_a?traduce en es instancia de .Bno es una instancia deA,B.newes aunque (B.new.is_a? A # => true).También disponible:
Esto difiere ligeramente de la respuesta (más corta) de
B < AporqueBestá incluida enB.ancestors:Si esto es deseable o no depende de su caso de uso.
fuente
B <= B(mismo resultado queB.ancestors.include? B).include?y recorren la cadena de antepasados . Hace esto en C, seguramente más rápido que recorrer la matriz de Ruby ... pero prácticamente los dos deberían ser indistinguibles.<B. Pero lo hace. La documentación del método dice: "Devuelve una lista de módulos incluidos / incluidos en el mod ( incluido el mod )". (énfasis mío). Supongo que incluye su propia clase por conveniencia cuando se usa.include?, pero eso es solo especulación de mi parte.