523 votes

Ruby: kind_of? vs instance_of? vs is_a?

Quelle est la différence? Quand dois-je utiliser? Pourquoi sont-ils si nombreux?

661voto

sepp2k Points 157757

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.

23voto

Jörg W Mittag Points 153275

Quelle est la différence?

À partir de la documentation:

- (Boolean) instance_of?(class)
Les retours true si obj est une instance de la classe donnée.

et:

- (Boolean) is_a?(class)
- (Boolean) kind_of?(class)
Les retours true si class la classe d' obj, ou si class est l'un des super-classes de obj ou modules inclus dans obj.

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.

9voto

kuonirat Points 38

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.

4voto

Boris Stitnicky Points 5409

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X