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
siobj
es una instancia de la clase dada.
y:
- - ( booleano )
is_a?(class)
- ( Boolean )kind_of?(class)
- Devuelve
true
siclass
es la clase deobj
, o siclass
es una de las superclases deobj
o módulos incluidos enobj
.
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
.