ruby inheritance introspection

Ruby: kind_of? vs. instance_of? vs. is_a?



inheritance introspection (4)

¿Cuál es la diferencia? ¿Cuándo debo usar cuál? ¿Por qué hay tantos de ellos?


¿Cuál es la diferencia?

De la documentación:

- ( Boolean ) instance_of?(class)
Devuelve true si obj es una instancia de la clase dada.

y:

- ( booleano ) is_a?(class)
- ( Boolean ) kind_of?(class)
Devuelve true si class es la clase de obj , o si class es una de las superclases de obj o módulos incluidos en obj .

Si eso no está claro, sería bueno saber qué es exactamente lo que no está claro, para que la documentación pueda mejorarse.

¿Cuándo debo usar cuál?

Nunca. Utilice polimorfismo en su lugar.

¿Por qué hay tantos de ellos?

No llamaría a dos "muchos". Hay dos de ellos, porque hacen dos cosas diferentes.


Es más parecido a Ruby preguntar a los objetos si responden a un método que necesita o no, utilizando respond_to? . Esto permite que tanto la interfaz mínima como la implementación no sean programadas

Por supuesto, no siempre es aplicable, por lo tanto, todavía existe la posibilidad de preguntar sobre una comprensión más conservadora del "tipo", que es una clase o una clase base, utilizando los métodos sobre los que pregunta.


Tampoco llamaría dos muchos alias ( is_a? Y kind_of? Son alias del mismo método), pero si quieres ver más posibilidades, #class tu atención al método #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


kind_of? y is_a? son sinónimos instance_of? es diferente de los otros dos en que solo devuelve true si el objeto es una instancia de esa clase exacta, no una subclase.

Ejemplo: "hello".is_a? Object "hello".is_a? Object y "hello".kind_of? Object "hello".kind_of? Object true porque "hello" es una String y una String es una subclase de Object . Sin embargo, "hello".instance_of? Object "hello".instance_of? Object devuelve false .