¿Cuál es la diferencia? ¿Cuándo debo usar cuál? ¿Por qué hay tantos de ellos?
ruby
inheritance
introspection
Claudiu
fuente
fuente
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.Respuestas:
kind_of?
yis_a?
son sinónimosinstance_of?
es diferente de los otros dos en que solo regresatrue
si el objeto es una instancia de esa clase exacta, no una subclase.Ejemplo:
"hello".is_a? Object
y"hello".kind_of? Object
volvertrue
porque"hello"
es unaString
yString
es una subclase deObject
."hello".instance_of? Object
vuelvefalse
.fuente
@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 nois_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 anularis_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.De la documentación:
y:
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.
Nunca. Utilice el polimorfismo en su lugar.
No llamaría a dos "muchos". Hay dos de ellos, porque hacen dos cosas diferentes.
fuente
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.
fuente
Tampoco llamaría a dos muchos (
is_a?
ykind_of?
son alias del mismo método), pero si desea ver más posibilidades, dirija su atención al#class
método:fuente