ruby - programacion - Determinación del tipo de un objeto en rubí.
ruby on rails orientado a objetos (4)
Usaré python como un ejemplo de lo que estoy buscando (puedes considerarlo como pseudocódigo si no sabes 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?
A menudo, en Ruby, a usted realmente no le importa lo que es la clase del objeto, solo le importa que responda a cierto método. Esto se conoce como Duck Typing y lo verás en todo tipo de bases de código de Ruby.
Así que en muchos casos (si no en la mayoría), es mejor usar Duck Typing usando #respond_to?(method)
:
object.respond_to?(:to_i)
La forma correcta de determinar el "tipo" de un objeto, que es un término inestable en el mundo de Ruby, es llamar a object.class
.
Dado que las clases pueden heredar de otras clases, si desea determinar si un objeto es "de un tipo particular", puede llamar a object.is_a?(ClassName)
para ver si el object
es de tipo ClassName
o se deriva de él.
Normalmente, la comprobación de tipos no se realiza en Ruby, sino que los objetos se evalúan en función de su capacidad para responder a métodos particulares, comúnmente denominados " tipificación de pato ". En otras palabras, si responde a los métodos que desea, no hay razón para ser más específicos sobre el tipo.
Por ejemplo, object.is_a?(String)
es demasiado rígido ya que otra clase podría implementar métodos que lo conviertan en una cadena, o hacer que se comporte de manera idéntica a cómo se comporta String. object.respond_to?(:to_s)
sería una mejor manera de probar que el objeto en cuestión hace lo que usted desea.
También puedes probar: instance_of?
p 1.instance_of? Fixnum #=> True
p "1".instance_of? String #=> True
p [1,2].instance_of? Array #=> True
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 añadir dijo: "Los datos tienen tipos, no objetos".
Para que podamos disfrutar de esto.
https://www.youtube.com/watch?v=1l3U1X3z0CE
Pero a Ruby no le importa mucho el tipo de objeto, solo la clase. Utilizamos clases no tipos. Todos los datos tienen una clase.
12345.class
''my string''.class
También pueden tener antepasados.
Object.ancestors
También tienen clases de meta, pero les guardaré los detalles sobre eso.
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 la búsqueda ...
"El modelo de objetos Ruby"
Este es el término usado para que Ruby maneje los objetos. Es todo interno, así que realmente no ves mucho de esto, pero es bueno saberlo. Pero ese es otro tema.
¡Sí! 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