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?
338
3
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 siobjeto
es del tipoNombreClase
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étodoobject.respond_to?(:to_s)
sería una mejor manera de comprobar que el objeto en cuestión hace lo que quieres.también puedes probar:
instance_of?
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)
: