Ik zal python gebruiken als voorbeeld van waar ik naar op zoek ben (je kunt het zien als pseudocode als je python niet kent):
>>> a = 1
>>> type(a)
<type 'int'>
Ik weet dat ik in ruby :
1.9.3p194 :002 > 1.class
=> Fixnum
Maar is dit de juiste manier om het type van het object te bepalen?
De juiste manier om het "type" van een object te bepalen, wat een wankele term is in de Ruby wereld, is door object.class
aan te roepen.
Omdat klassen kunnen overerven van andere klassen, als je wilt bepalen of een object "van een bepaald type" is, zou je object.is_a?(ClassName)
kunnen oproepen om te zien of object
van het type ClassName
is of daarvan is afgeleid.
Normaal gesproken wordt er geen type-controle gedaan in Ruby, maar in plaats daarvan worden objecten beoordeeld op basis van hun vermogen om te reageren op bepaalde methoden, algemeen genoemd "Duck typing". Met andere woorden, als het reageert op de methoden die u wilt, is er geen reden om kieskeurig te zijn over het type.
Bijvoorbeeld, object.is_a?(String)
is te rigide omdat een andere klasse methodes zou kunnen implementeren die het omzetten in een string, of het identiek laten gedragen als hoe String zich gedraagt. object.respond_to?(:to_s)
zou een betere manier zijn om te testen of het object in kwestie doet wat je wilt.
je zou het ook kunnen proberen: instance_of?
p 1.instance_of? Fixnum #=> True
p "1".instance_of? String #=> True
p [1,2].instance_of? Array #=> True
Vaak geef je er in Ruby niet om wat de klasse van een object is, je geeft er alleen om dat het op een bepaalde methode reageert. Dit staat bekend als Duck Typing en je'zult het in allerlei Ruby codebases zien.
Dus in veel (zo niet de meeste) gevallen, is het het beste om Duck Typing te gebruiken met #respond_to?(method)
:
object.respond_to?(:to_i)