¿Algo así? vs instancia de? vs es?
¿Cuál es la diferencia? ¿Cuándo debo usar cuál? ¿Por qué hay tantos?
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
.
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)
Devuelvetrue
siobj
es una instancia de la clase dada.
Y:
- (Boolean)is_a?(class)
- (Boolean)kind_of?(class)
Devuelvetrue
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é 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.
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.
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
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