471 Stimmen

Bestimmung des Typs eines Objekts in Ruby

Ich werde Python als Beispiel dafür verwenden, was ich suche (Sie können es als Pseudocode betrachten, wenn Sie Python nicht kennen):

>>> a = 1
>>> type(a)

Ich weiß, dass ich in Ruby Folgendes tun kann:

1.9.3p194 :002 > 1.class
 => Fixnum 

Aber ist dies der richtige Weg, um den Typ des Objekts zu bestimmen?

748voto

tadman Punkte 200181

Der richtige Weg, um den "Typ" eines Objekts zu bestimmen, der in der Ruby-Welt ein schwammiger Begriff ist, ist object.class aufzurufen.

Da Klassen von anderen Klassen erben können, wenn Sie herausfinden wollen, ob ein Objekt "von einem bestimmten Typ" ist, könnten Sie object.is_a?(KlassenName) aufrufen, um zu sehen, ob object vom Typ KlassenName ist oder davon abgeleitet ist.

Normalerweise erfolgt in Ruby keine Typüberprüfung, sondern Objekte werden anhand ihrer Fähigkeit beurteilt, auf bestimmte Methoden zu reagieren, die im Allgemeinen als "Duck-Typing" bezeichnet werden. Mit anderen Worten, wenn es auf die gewünschten Methoden reagiert, gibt es keinen Grund, auf den Typ genau zu achten.

Zum Beispiel ist object.is_a?(String) zu starr, da eine andere Klasse Methoden implementieren könnte, die es in einen String umwandeln oder es so verhalten, wie String es tut. object.respond_to?(:to_s) wäre ein besserer Weg, um zu testen, ob das betreffende Objekt das tut, was Sie wollen.

107voto

Arup Rakshit Punkte 113145

Sie könnten auch versuchen: instance_of?

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

53voto

Stuart M Punkte 11260

Oftentimes in Ruby, you don't actually care what the object's class is, per se, you just care that it responds to a certain method. This is known as Duck Typing and you'll see it in all sorts of Ruby codebases.

So in many (if not most) cases, its best to use Duck Typing using #respond_to?(method):

object.respond_to?(:to_i)

36voto

Douglas G. Allen Punkte 2085

Ich würde "Ja" sagen. Matz hatte in einem seiner Vorträge so etwas gesagt: "Ruby-Objekte haben keine Typen." Nicht alles, sondern der Teil, den er uns vermitteln möchte. Warum hätte jemand dann gesagt, "Alles ist ein Objekt"? Außerdem sagte er: "Daten haben Typen, nicht Objekte."

RubyConf 2016 - Eröffnungsvortrag von Yukihiro 'Matz' Matsumoto

Aber Ruby kümmert sich nicht so sehr um den Objekttyp wie um die Klasse. Wir verwenden Klassen, nicht Typen. Also hat alle Daten eine Klasse.

12345.class

'mein String'.class

Klassen können auch Vorfahren haben.

Object.ancestors

Sie haben auch Metaklassen, aber ich erspare Ihnen die Details dazu.

Wenn Sie die Klasse kennen, können Sie nachschlagen, welche Methoden Sie dafür verwenden können. Das ist, wo der "Datentyp" benötigt wird. Wenn Sie wirklich ins Detail gehen möchten, suchen Sie nach...

"Das Ruby-Objektmodell"

Dies ist der Begriff dafür, wie Ruby mit Objekten umgeht. Es ist alles intern, also sehen Sie nicht wirklich viel davon, aber es ist gut zu wissen. Aber das ist ein anderes Thema.

Ja! Die Klasse ist der Datentyp. Objekte haben Klassen und Daten haben Typen. Wenn Sie über Datenbanken Bescheid wissen, dann wissen Sie, dass es nur eine endliche Anzahl von Typen gibt.

Textblöcke Zahlen

4voto

Variable_name.class

Hier ist der Variablenname "a" a.class

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X