it-swarm.com.de

Bestimmen des Objekttyps in ruby

Ich verwende python als Beispiel für das, wonach ich suche (Sie können es sich als Pseudocode vorstellen, wenn Sie Python nicht kennen):

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

Ich weiß in Ruby, was ich tun kann:

1.9.3p194 :002 > 1.class
 => Fixnum 

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

319
Zippy Zeppoli

Der richtige Weg, den "Typ" eines Objekts zu bestimmen, der in der Ruby Welt ein wackeliger Begriff ist, besteht darin, object.class aufzurufen.

Da Klassen von anderen Klassen erben können, können Sie object.is_a?(ClassName) aufrufen, um festzustellen, ob object vom Typ ClassName ist oder von diesem abgeleitet wurde es.

Normalerweise wird die Typprüfung nicht in Ruby durchgeführt, sondern Objekte werden anhand ihrer Fähigkeit bewertet, auf bestimmte Methoden zu reagieren, die im Allgemeinen als " Duck typing " bezeichnet werden. Mit anderen Worten, wenn es auf die von Ihnen gewünschten Methoden reagiert, gibt es keinen Grund, den Typ genau zu bestimmen.

Beispielsweise ist object.is_a?(String) zu starr, da eine andere Klasse möglicherweise Methoden implementiert, mit denen sie in eine Zeichenfolge konvertiert wird, oder bewirkt, dass sie sich genauso verhält wie die Zeichenfolge. object.respond_to?(:to_s) ist eine bessere Möglichkeit, um zu testen, ob das betreffende Objekt das tut, was Sie wollen.

533
tadman

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
_
71
Arup Rakshit

In Ruby ist es Ihnen oft egal, welche Klasse das Objekt an sich hat. Sie kümmern sich nur darum, dass es auf eine bestimmte Methode reagiert. Dies ist als Duck Typing bekannt und wird in allen möglichen Ruby Codebasen angezeigt.

In vielen (wenn nicht den meisten) Fällen empfiehlt es sich, Duck Typing mit #respond_to?(method) zu verwenden:

object.respond_to?(:to_i)
40
Stuart M

Ich würde Ja sagen". Wie "Matz" in einem seiner Vorträge so etwas gesagt hatte: "Ruby-Objekte haben keine Typen." Nicht alles, aber der Teil, den er uns vermitteln will. Warum hätte dann jemand gesagt "Alles ist ein Objekt"? Um hinzuzufügen, sagte er "Daten haben Typen keine Objekte".

Das könnte uns also gefallen.

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

Aber Ruby kümmert sich nicht so sehr um den Objekttyp, sondern nur um die Klasse. Wir verwenden Klassen, keine Typen. Alle Daten haben dann eine Klasse.

12345.class

'my string'.class

Sie können auch Vorfahren haben

Object.ancestors

Sie haben auch Meta-Klassen, aber ich werde Ihnen die Details dazu speichern.

Sobald Sie die Klasse kennen, können Sie nachschlagen, welche Methoden Sie dafür verwenden können. Hier wird der "Datentyp" benötigt. Wenn Sie wirklich ins Detail wollen, schauen Sie nach ...

"Das Ruby Objektmodell"

Dies ist der Begriff, der für den Umgang mit Objekten in Ruby verwendet wird. Es ist alles intern, so dass Sie nicht wirklich viel davon sehen, aber es ist schön zu wissen. Aber das ist ein anderes Thema.

Ja! Die Klasse ist der Datentyp. Objekte haben Klassen und Daten Typen. Wenn Sie sich also mit Datenbanken auskennen, wissen Sie, dass es nur eine endliche Menge von Typen gibt.

text blockiert Zahlen

14