Determinar el tipo de un objeto en ruby


Usaré python como ejemplo de lo que estoy buscando (puedes pensar en ello como 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?

 268
Author: Yuxuan Chen, 2013-04-02

4 answers

La forma correcta de determinar el "tipo" de un objeto, que es un término tambaleante en el mundo 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 object es de tipo ClassName o 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 llamados " Pato typing ". 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.

 452
Author: tadman,
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
2017-11-10 21:10:44

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
 55
Author: Arup Rakshit,
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-04-02 17:03:58

A menudo en Ruby, realmente no te importa cuál es la clase del objeto, per se, solo te importa que responda a un cierto método. Esto se conoce como Duck Typing y lo verás en todo tipo de bases de código Ruby.

Así que en muchos (si no la mayoría) casos, es mejor usar Duck Typing usando #respond_to?(method):

object.respond_to?(:to_i)
 34
Author: Stuart M,
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-04-02 16:56:01

Yo diría "Sí". Como "Matz" había dicho algo como esto en una de sus charlas, "Los objetos Ruby no tienen tipos." No todo, pero la parte que está tratando de llegar a nosotros. ¿Por qué alguien habría dicho "Todo es un Objeto" entonces? Para añadir dijo que "Los datos tienen tipos no objetos".

Así que podríamos 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 tipo. Todos los datos tienen una clase.

12345.class

'my string'.class

También pueden tener antepasados

Object.ancestors

También tienen meta clases, pero te 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, mira hacia arriba...

"El Modelo de Objetos Ruby"

Este es el término usado para cómo Ruby maneja 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. Así que si usted sabe acerca de bases de datos, entonces usted sabe que solo hay un conjunto finito de tipos.

Bloques de texto números

 7
Author: Douglas G. Allen,
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
2017-05-26 21:18:41