Tester si une classe Ruby est une sous-classe d'une autre classe
Je voudrais tester si une classe hérite d'une autre classe, mais il ne semble pas exister une méthode pour cela.
class A
end
class B < A
end
B.is_a? A
=> false
B.superclass == A
=> true
Une implémentation simple de ce que je veux serait:
class Class
def is_subclass_of?(clazz)
return true if superclass == clazz
return false if self == Object
superclass.is_subclass_of?(clazz)
end
end
mais je voudrais attendre à ce que cela existe déjà.
A.class #=> Class
. C'est pourquoiB.is_a? A
renvoie la valeur false.- qu'en est
kind_of?
kind_of?
teste si un objet est une instance d'une classe. Pas si l'objet hérite d'une classe.kind_of?
est un alias deis_a?
Vous devez vous connecter pour publier un commentaire.
Suffit d'utiliser la
<
opérateurou utiliser le
<=
opérateuris_a?
n'est pas le cas? Merci!is_a?
se traduit par est l'instance de.B
n'est pas une instance deA
,B.new
est bien (B.new.is_a? A # => true
).thing.class < X
au lieu dething.is_a? X
, parce que la deuxième version comprend des modulesmodule#<
t inclure des modules ainsiÉgalement disponibles:
Ce qui diffère légèrement de la (courte) réponse de
B < A
parce queB
est inclus dansB.ancestors
:Si oui ou non ce est souhaitable dépend de votre cas d'utilisation.
B <= B
(même résultat queB.ancestors.include? B
).ancestors?
mentionné dans la réponse sur cette page, y compris celui-ci. À quoi faites-vous référence?B < A
significativement plus rapide, ou font-ils de la même chose derrière les coulisses?include?
et<
méthodes boucle à travers l'ancêtre de la chaîne d'. Il le fait en C, donc sûrement plus vite qu'en parcourant le Rubis tableau...mais pratiquement, les deux devrait être identique.B.ancestors
renvoie lui-mêmeB
aussi? Ne doit-il pas être[A, Object, Kernel, BasicObject]
?B
. Mais il le fait. Le documentation de la méthode dit, "Renvoie une liste de modules inclus/ajouté dans le mod (y compris le mod lui-même)." (l'emphase est mienne). J'imagine qu'il comprend sa propre classe pour plus de commodité lors de l'utilisation de.include?
, mais ce n'est que spéculation de ma part.