¿Cuál es la diferencia? ¿Cuándo debo usar cuál? ¿Por qué hay tantos de ellos?
¿Cuál es la diferencia? ¿Cuándo debo usar cuál? ¿Por qué hay tantos de ellos?
Respuestas:
kind_of?
y is_a?
son sinónimos
instance_of?
es diferente de los otros dos en que solo regresa true
si el objeto es una instancia de esa clase exacta, no una subclase.
Ejemplo:
"hello".is_a? Object
y "hello".kind_of? Object
volver true
porque "hello"
es una String
y String
es una subclase de Object
."hello".instance_of? Object
vuelve false
.@honda.kind_of? Car
y @person.is_a? Administrator
Ruby tiene que ver con la estética. De hecho, observe el error gramatical ... con el soporte activo puede escribir @person.is_an? Administrator
:) ... Eso podría haber llegado al núcleo de Ruby por ahora, en realidad.
kind_of?
pero no is_a?
?
is_an?
no está en ruby-1.9.2-p0. @Claudiu, no. is_a?
es solo un alias dekind_of?
. Ambos métodos invocar la misma función c, rb_obj_is_kind_of
.
kind_of?
sin anular is_a?
.
is_an?
método ActiceSupport ? No está en la versión actual de rails, y tampoco puedo encontrar nada en Google sobre que sea obsoleto.
¿Cuál es la diferencia?
De la documentación:
- - ( booleano )
instance_of?(class)
- Devuelve
true
siobj
es una instancia de la clase dada.
y:
- - ( Booleano )
is_a?(class)
- ( Booleano )kind_of?(class)
- Devuelve
true
siclass
es la clase deobj
, o siclass
es una de las superclasesobj
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 se pueda mejorar.
¿Cuándo debo usar cuál?
Nunca. Utilice el 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 una interfaz mínima y una programación inconsciente de implementación.
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 clase o una clase base, utilizando los métodos que está solicitando.
Tampoco llamaría a dos muchos ( is_a?
y kind_of?
son alias del mismo método), pero si desea ver más posibilidades, dirija su atención al #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
is_a?
ykind_of?
existir: Supongo que es parte de la filosofía de diseño de Ruby. Python diría que solo debería haber una forma de hacer algo; Ruby a menudo tiene métodos sinónimos para que pueda usar el que suena mejor. Es una cuestión de preferencia. Puede deberse en parte a la influencia japonesa: me han dicho que usarán una palabra diferente para el mismo número dependiendo de la oración para que suene mejor. Matz puede haber llevado esa idea al diseño de su lenguaje.