Userò python come esempio di quello che sto cercando (potete pensarlo come uno pseudocodice se non conoscete Python):
>>> a = 1
>>> type(a)
<type 'int'>
So che in rubino posso fare :
1.9.3p194 :002 > 1.class
=> Fixnum
Ma è questo il modo corretto per determinare il tipo di oggetto?
Il modo corretto per determinare il "tipo" di un oggetto, che è un termine traballante nel mondo Ruby, è chiamare object.class
.
Poiché le classi possono ereditare da altre classi, se vuoi determinare se un oggetto è "di un particolare tipo" potresti chiamare object.is_a?(ClassName)
per vedere se object
è del tipo ClassName
o deriva da esso.
Normalmente il controllo di tipo non è fatto in Ruby, ma invece gli oggetti sono valutati in base alla loro capacità di rispondere a particolari metodi, comunemente chiamati "Duck typing". In altre parole, se risponde ai metodi che volete, non c'è motivo di essere particolari sul tipo.
Per esempio, object.is_a?(String)
è troppo rigido poiché un'altra classe potrebbe implementare metodi che lo convertono in una stringa, o farlo comportare in modo identico a come si comporta String. object.respond_to?(:to_s)
sarebbe un modo migliore per testare che l'oggetto in questione faccia ciò che volete.
si potrebbe anche provare: instance_of?
p 1.instance_of? Fixnum #=> True
p "1".instance_of? String #=> True
p [1,2].instance_of? Array #=> True
Spesso in Ruby, non ci si preoccupa di quale sia la classe dell'oggetto, di per sé, ci si preoccupa solo che risponda ad un certo metodo. Questo è noto come Duck Typing e lo vedrete in tutti i tipi di codice Ruby.
Quindi in molti (se non la maggior parte) dei casi, è meglio usare il Duck Typing usando #respond_to?(method)
:
object.respond_to?(:to_i)