Usaré python como ejemplo de lo que estoy buscando (puedes pensar en él como un pseudocódigo si no conoces Python):
>>> a = 1
>>> type(a)
<type 'int'>
Sé que en ruby puedo hacer:
1.9.3p194 :002 > 1.class
=> Fixnum
¿Pero es esta la forma correcta de determinar el tipo de objeto?
isinstance
o verificaría si responde. Pero simplemente diciendo "NOES !!!" no es realmente útil, ahora, ¿verdad? En cambio, considere ser educativo.Respuestas:
La forma correcta de determinar el "tipo" de un objeto, que es un término tambaleante en el mundo de Ruby, es llamar
object.class
.Dado que las clases pueden heredar de otras clases, si desea determinar si un objeto es "de un tipo particular", puede llamar
object.is_a?(ClassName)
para ver siobject
es de tipoClassName
o derivado de él.Normalmente, la verificación de tipo no se realiza en Ruby, sino que los objetos se evalúan en función de su capacidad de responder a métodos particulares, comúnmente llamados " mecanografía de pato ". En otras palabras, si responde a los métodos que desea, no hay razón para ser particular sobre el tipo.
Por ejemplo,
object.is_a?(String)
es demasiado rígido ya que otra clase podría implementar métodos que lo convierten en una cadena, o hacer que se comporte de manera idéntica a cómo se comporta la cadena.object.respond_to?(:to_s)
sería una mejor manera de probar que el objeto en cuestión hace lo que quieres.fuente
#class
no no devolver el tipo del objeto, devuelve su clase . El nombre debe ser un regalo muerto. Clase y tipo son dos conceptos completamente diferentes en OO.typeof
C, JavaScript y otros esclass
. No existe un sistema de protocolo formal en Ruby como en otros lenguajes, siendo Objective-C el pariente más pequeño de Smalltalk con eso. Si está definiendo "tipo" como "objeto que responde a un conjunto particular de métodos con resultados aceptables", entonces no hay forma de afirmarlo. Es demasiado flojo. La mayoría de las veces en Ruby cuando se refiere al tipo de un objeto, se entiende que estás hablando de la clase. Utilicé el término tipo entre comillas por esa misma razón.int i
" o "Integer j
".) Tadman respondió a la pregunta de una manera que parecía satisfacer tanto el interrogador y el público en general, mientras aclara la terminología que utiliza Ruby. No tengo ningún interés en entrar en una división académica sobre los puntos más finos de la terminología orientada a objetos, así que tenga la última palabra.También puedes probar:
instance_of?
fuente
A menudo en Ruby, en realidad no te importa cuál es la clase del objeto, per se, solo te importa que responda a un determinado método. Esto se conoce como Duck Typing y lo verá en todo tipo de bases de código Ruby.
Entonces, en muchos (si no la mayoría) de los casos, es mejor usar Duck Typing usando
#respond_to?(method)
:fuente
Yo diría que sí". Como "Matz" había dicho algo como esto en una de sus charlas, "los objetos de Ruby no tienen tipos". No todo, sino la parte que está tratando de transmitirnos. ¿Por qué alguien habría dicho "Todo es un objeto" entonces? Para agregar, dijo: "Los datos tienen tipos, no objetos".
Entonces podríamos disfrutar esto.
https://www.youtube.com/watch?v=1l3U1X3z0CE
Pero a Ruby no le importa mucho el tipo de objeto, solo la clase. Usamos clases, no tipos. Todos los datos tienen una clase.
También pueden tener antepasados
También tienen metaclases, pero te guardaré los detalles al respecto.
Una vez que conozca la clase, podrá buscar qué métodos puede usar para ella. Ahí es donde se necesita el "tipo de datos". Si realmente quieres entrar en detalles, mira hacia arriba ...
"El modelo de objetos de rubí"
Este es el término utilizado para la forma en que Ruby maneja los objetos. Todo es interno, por lo que realmente no se ve mucho de esto, pero es bueno saberlo. Pero ese es otro tema.
¡Si! La clase es el tipo de datos. Los objetos tienen clases y los datos tienen tipos. Entonces, si conoce las bases de datos, entonces sabe que solo hay un conjunto finito de tipos.
números de bloques de texto
fuente
Object.ancestors # => [Object, Kernel, BasicObject]