Het type van een object in robijn bepalen

Ik gebruik python als voorbeeld van wat ik zoek (je kunt het zien als pseudocode als je Python niet kent):

>>> a = 1
>>> type(a)
<type 'int'>

Ik weet dat ik in robijn kan doen :

1.9.3p194 :002 > 1.class
 => Fixnum 

Maar is dit de juiste manier om het type object te bepalen?


Antwoord 1, autoriteit 100%

De juiste manier om het “type” van een object te bepalen, wat een wankele term is in de Ruby-wereld, is door object.classaan te roepen.

Aangezien klassen kunnen erven van andere klassen, kunt u, als u wilt bepalen of een object “van een bepaald type” is, object.is_a?(ClassName)aanroepen om te zien of objectis van het type ClassNameof is daarvan afgeleid.

Normaal gesproken wordt typecontrole niet uitgevoerd in Ruby, maar in plaats daarvan worden objecten beoordeeld op hun vermogen om te reageren op bepaalde methoden, gewoonlijk “Eend typen“. Met andere woorden, als het reageert op de gewenste methoden, is er geen reden om specifiek te zijn over het type.

Bijvoorbeeld, object.is_a?(String)is te rigide omdat een andere klasse methoden zou kunnen implementeren die het in een tekenreeks omzetten, of ervoor zorgen dat het zich identiek gedraagt als hoe String zich gedraagt. object.respond_to?(:to_s)zou een betere manier zijn om te testen of het betreffende object doet wat je wilt.


Antwoord 2, autoriteit 13%

je zou ook kunnen proberen: instance_of?

p 1.instance_of? Fixnum    #=> True
p "1".instance_of? String  #=> True
p [1,2].instance_of? Array #=> True

Antwoord 3, autoriteit 7%

Vaak in Ruby maakt het je eigenlijk niet uit wat de klasse van het object is, maar alleen dat het reageert op een bepaalde methode. Dit staat bekend als Duck Typingen je ziet het in allerlei Ruby-codebases.

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)

Antwoord 4, autoriteit 4%

Ik zou “Ja” zeggen.
Zoals “Matz” zoiets in een van zijn toespraken had gezegd,
“Ruby-objecten hebben geen typen.”
Niet alles, maar het deel dat hij ons probeert over te brengen.
Waarom zou iemand hebben gezegd?
“Alles is een Object” dan?
Om toe te voegen zei hij: “Gegevens hebben typen, geen objecten”.

Dus misschien genieten we hiervan.

https://www.youtube.com/watch?v=1l3U1X3z0CE

Maar Ruby geeft niet zoveel om het type object, alleen de klasse.
We gebruiken klassen, geen typen. Alle gegevens hebben dan een klasse.

12345.class
'my string'.class

Ze kunnen ook voorouders hebben

Object.ancestors

Ze hebben ook metalessen, maar ik zal je de details daarover besparen.

Zodra je de klasse kent, kun je opzoeken welke methoden je ervoor kunt gebruiken. Dat is waar het “gegevenstype” nodig is.
Als je echt in details wilt komen, de opzoek …

“Het robijn-objectmodel”

Dit is de term die wordt gebruikt voor hoe robijngrepen objecten. Het is allemaal intern, dus je ziet dit niet echt veel van dit, maar het is leuk om te weten. Maar dat is een ander onderwerp.

Ja! De klasse is het gegevenstype. Objecten hebben klassen en gegevens hebben typen. Dus als u weet over gegevensbases, weet u dat er slechts een eindige set typen zijn.

Tekstblokken
nummers


Antwoord 5

variable_name.class

Hier variabele naam is “A”
a.class

Other episodes