Determinación del tipo de un objeto en ruby

Utilizaré python como ejemplo de lo que estoy buscando (puedes pensar en ello como un 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 adecuada de determinar el tipo del objeto?

Solución

La forma correcta de determinar el "tipo" de un objeto, que es un término vacilante en el mundo de Ruby, es llamar a object.class.

Dado que las clases pueden heredar de otras clases, si quieres determinar si un objeto es "de un tipo particular" podrías llamar a object.is_a?(NombreClase) para ver si objeto es del tipo NombreClase o deriva de él.

Normalmente la comprobación de tipo no se hace en Ruby, sino que los objetos se evalúan en base a su capacidad de responder a métodos particulares, comúnmente llamados "Duck typing". En otras palabras, si responde a los métodos que quieres, 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 conviertan en una cadena, o hacer que se comporte de forma idéntica a como se comporta String. El método object.respond_to?(:to_s) sería una mejor manera de comprobar que el objeto en cuestión hace lo que quieres.

Comentarios (8)

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
Comentarios (1)

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

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

object.respond_to?(:to_i)
Comentarios (1)