Je voudrais tester si une classe hérite d'une autre classe, mais il ne semble pas exister de méthode pour cela.
class A
end
class B < A
end
B.is_a? A
=> false
B.superclass == A
=> true
Une implémentation triviale 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 m'attendrais à ce que cela existe déjà.
ruby
inheritance
subclass
superclass
Confusion
la source
la source
A.class #=> Class
. C'est pourquoiB.is_a? A
renvoie false.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?
Réponses:
Utilisez simplement l'
<
opérateurB < A # => true A < A # => false
ou utilisez l'
<=
opérateurB <= A # => true A <= A # => true
la source
is_a?
traduit par une instance de .B
n'est pas une instance deA
,B.new
est si (B.new.is_a? A # => true
).Aussi disponible:
B.ancestors.include? A
Cela diffère légèrement de la réponse (plus courte) de
B < A
car elleB
est incluse dansB.ancestors
:B.ancestors #=> [B, A, Object, Kernel, BasicObject] B < B #=> false B.ancestors.include? B #=> true
Que cela soit souhaitable ou non dépend de votre cas d'utilisation.
la source
B <= B
(même résultat queB.ancestors.include? B
).include?
et parcourent la chaîne des ancêtres . Il le fait en C, donc sûrement plus vite que de boucler le tableau Ruby ... mais pratiquement les deux devraient être indiscernables.<
B
. Mais c'est le cas. La documentation de la méthode dit: "Renvoie une liste des modules inclus / ajoutés au début du mod ( y compris le mod lui-même )." (c'est moi qui souligne). Je suppose qu'il inclut sa propre classe pour plus de commodité lors de son utilisation.include?
, mais ce n'est que de la spéculation de ma part.