Ruby: kind_of? vs instance_of? vs is_a?

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

kind_of? et is_a? sont synonymes. instance_of? est différent des deux autres en ce sens qu’il ne renvoie que true si l’object est une instance de cette classe exacte, et non une sous-classe.

Exemple: "hello".is_a? Object "hello".is_a? Object et "hello".kind_of? Object "hello".kind_of? Object renvoie true car "hello" est une Ssortingng et Ssortingng est une sous-classe de Object . Cependant "hello".instance_of? Object "hello".instance_of? Object renvoie false .

Quelle est la différence?

De la documentation:

– ( booléen ) instance_of?(class)
Renvoie true si obj est une instance de la classe donnée.

et:

– ( booléen ) is_a?(class)
– ( booléen ) kind_of?(class)
Retourne true si class est la classe d’ obj , ou si class est l’une des super- class d’ obj ou de modules inclus dans obj .

Si cela n’est pas clair, il serait bon de savoir ce qui n’est pas clair, afin que la documentation puisse être améliorée.

Quand devrais-je utiliser lequel?

Jamais. Utilisez plutôt le polymorphism.

Pourquoi y en a-t-il autant?

Je n’appellerais pas deux “plusieurs”. Il y en a deux, car ils font deux choses différentes.

Il est plus comme Ruby de demander aux objects s’ils 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, ce n’est pas toujours applicable, il est donc toujours possible de poser des questions sur la compréhension plus conservasortingce de “type”, qui est une classe ou une classe de base, en utilisant les méthodes dont vous parlez.

Je ne voudrais pas non plus appeler deux beaucoup ( is_a? Et kind_of? Sont des alias de la même méthode), mais si vous voulez voir plus de possibilités, #class votre attention sur la méthode #class :

 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