Quelle est la différence? Quand dois-je utiliser? Pourquoi sont-ils si nombreux?
Réponses
Trop de publicités?kind_of?
et is_a?
sont des synonymes. instance_of?
est différent des deux autres en ce qu'elle ne retourne true si l'objet est une instance de la même classe, pas une sous-classe.
Exemple: 5.is_a? Integer
et 5.kind_of? Integer
return true car 5
est Fixnum
et Fixnum
est une sous-classe de Integer
. Toutefois 5.instance_of? Integer
renvoie la valeur false.
Quelle est la différence?
À partir de la documentation:
- - (Boolean)
instance_of?(class)
- Les retours
true
siobj
est une instance de la classe donnée.et:
- - (Boolean)
is_a?(class)
- (Boolean)kind_of?(class)
- Les retours
true
siclass
la classe d'obj
, ou siclass
est l'un des super-classes deobj
ou modules inclus dansobj
.Si c'est pas clair, il serait bon de savoir ce qui exactement est pas clair, de sorte que la documentation peut être amélioré.
Quand dois-je utiliser?
Jamais. Utiliser le polymorphisme à la place.
Pourquoi sont-ils si nombreux?
Je ne dirais pas deux "beaucoup". Il y a deux d'entre eux, parce qu'ils font deux choses différentes.
Plus de rubis style est de poser des objets, s'ils répondent à une méthode, vous devez ou non, en utilisant respond_to? . Cela permet à la fois minimale de l'interface et la mise en œuvre pas au courant de la programmation. Pas toujours applicable de cours, donc il est toujours possible de demander à la plus conservatrice de la compréhension de "type", qui est de classe ou d'une classe de base, en utilisant les méthodes que vous êtes en demandant au sujet.
Je n'ai pas appeler deux beaucoup (is_a?
et kind_of?
sont des alias de la même manière), mais si vous voulez voir encore plus de possibilités, tournez votre attention vers #class
méthode:
A = Class.new
B = Class.new A
a, b = A.new, B.new
b.class < A # true - means that b.class is a subclass of A
a.class < B # false - means that a.class is not a subclass of A
# Another possibility: Use #ancestors
b.class.ancestors.include? A # true - means that b.class has A among its ancestors
a.class.ancestors.include? B # false - means that B is not an ancestor of a.class