Jeg vil bruke python som et eksempel på hva jeg leter etter (du kan tenke på det som pseudokode hvis du ikke kjenner Python):
>>> a = 1
>>> type(a)
<type 'int'>
Jeg vet i ruby jeg kan gjøre:
1.9.3p194 :002 > 1.class
=> Fixnum
Men er dette den riktige måten å bestemme objektets type på?
Den riktige måten å bestemme "type" av et objekt, som er et vaklende begrep i Ruby-verdenen, er å kalle object.class
.
Siden klasser kan arve fra andre klasser, hvis du ønsker å avgjøre om et objekt er "av en bestemt type" du kan kalle object.is_a?(ClassName)
for å se om objekt
er av typen ClassName
eller avledet fra den.
Normalt utføres ikke typesjekking i Ruby, men i stedet vurderes objekter ut fra deres evne til å svare på bestemte metoder, ofte kalt "Duck typing". Med andre ord, hvis det reagerer på de metodene du ønsker, er det ingen grunn til å være nøye med typen.
For eksempel, object.is_a?(String)
er for stiv siden en annen klasse kan implementere metoder som konverterer den til en streng, eller få den til å oppføre seg identisk med hvordan String oppfører seg. object.respond_to?(:to_s)
ville være en bedre måte å teste at det aktuelle objektet gjør det du ønsker.
kan du også prøve: instance_of?
p 1.instance_of? Fixnum #=> True
p "1".instance_of? String #=> True
p [1,2].instance_of? Array #=> True
Ofte i Ruby, du don't faktisk bryr seg hva objektet's klasse er, per se, du bare bryr deg om at det reagerer på en bestemt metode. Dette er kjent som Duck Typing og du'll se det i alle slags Ruby-kodebaser.
Så i mange (om ikke de fleste) tilfeller er det best å bruke Duck Typing ved hjelp av #respond_to?(method)
:
object.respond_to?(:to_i)