¿Algo así? vs instancia de? vs es?


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

Author: Brickgao, 2010-10-08

4 answers

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 y "hello".kind_of? Object return true porque "hello" es a String y String es una subclase de Object. Sin embargo "hello".instance_of? Object devuelve false.

 557
Author: sepp2k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-18 06:40:23

¿Cuál es la diferencia?

De la documentación:

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

Y:

- (Boolean) 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é exactamente no está claro, por lo que la documentación se puede mejorar.

¿Cuándo debo usar cuál?

Nunca. Use polimorfismo en su lugar.

¿por Qué hay tantos de ellos?

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

 15
Author: Jörg W Mittag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-08 18:44:14

Es más parecido a Ruby preguntar a los objetos si responden a un método que necesitas o no, usando respond_to?. Esto permite una interfaz mínima y una programación ignorante de la implementación.

No siempre es aplicable, por supuesto, por lo tanto, todavía hay una posibilidad de preguntar sobre una comprensión más conservadora de "tipo", que es clase o una clase base, utilizando los métodos que estás preguntando.

 5
Author: kuonirat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-19 19:36:32

Tampoco llamaría a dos muchos (is_a? y kind_of? son alias del mismo método), pero si quieres ver más posibilidades, dirígete a #class método:

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
Author: Boris Stitnicky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-10 17:39:58