Question Ruby: kind_of? vs instance_of? vs is_a?


Quelle est la différence? Quand devrais-je utiliser quoi? Pourquoi y en a-t-il autant?


428
2017-10-08 18:28


origine


Réponses:


kind_of? et is_a? sont synonymes. instance_of? est différent des deux autres en ce qu'il ne fait que revenir true si l'objet est une instance de cette classe exacte, pas une sous-classe.

Exemple: "hello".is_a? Object et "hello".kind_of? Object revenir true car "hello" est un String et String est une sous-classe de Object. toutefois "hello".instance_of? Object résultats false.


548
2017-10-08 18:30



Quelle est la différence?

De la documentation:

- (Booléen) instance_of?(class)
Résultats true si obj est une instance de la classe donnée.

et:

- (Booléen) is_a?(class)
- (Booléen) kind_of?(class)
Résultats true si class est la classe de obj, ou si class est l'une des superclasses de obj ou modules inclus dans obj.

Si cela n'est pas clair, il serait bon de savoir ce que exactement n'est pas clair, de sorte que la documentation peut être améliorée.

Quand devrais-je utiliser quoi?

Jamais. Utilisez plutôt le polymorphisme.

Pourquoi y en a-t-il autant?

Je n'appellerais pas deux "beaucoup". Il y en a deux, parce qu'ils font deux choses différentes.


14
2017-10-08 18:44



Il est plus Ruby-like de demander des objets si elles répondent à une méthode dont vous avez besoin ou non, en utilisant respond_to?. Cela permet à la fois une programmation minimale de l'interface et de l'implémentation.

Bien sûr, cela n'est pas toujours applicable, il est donc toujours possible de poser des questions sur la compréhension plus conservatrice de "type", qui est une classe ou une classe de base, en utilisant les méthodes dont vous parlez.


5
2018-05-09 12:22



Je n'appellerais pas non plus deux personnesis_a? et kind_of? sont des alias de la même méthode), mais si vous voulez voir plus de possibilités, portez votre attention sur #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

3
2018-06-10 17:39