Ich werde Python als Beispiel für das verwenden, 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 Rubin, was ich tun kann:
1.9.3p194 :002 > 1.class
=> Fixnum
Aber ist dies der richtige Weg, um den Typ des Objekts zu bestimmen?
isinstance
oder suchen nach Antworten. Aber einfach "NEIN !!!" sagen ist jetzt nicht wirklich hilfreich, oder? Betrachten Sie stattdessen als lehrreich.Antworten:
Der richtige Weg, um den "Typ" eines Objekts zu bestimmen, was in der Ruby-Welt ein wackeliger Begriff ist, ist das Aufrufen
object.class
.Da Klassen von anderen Klassen erben können, können Sie aufrufen
object.is_a?(ClassName)
, ob ein Objekt "von einem bestimmten Typ" ist, um festzustellen , obobject
es vom Typ istClassName
oder von diesem abgeleitet ist.Normalerweise wird die Typprüfung nicht in Ruby durchgeführt, sondern Objekte werden anhand ihrer Fähigkeit bewertet, auf bestimmte Methoden zu reagieren, die üblicherweise als " Ententypisierung " bezeichnet werden. Mit anderen Worten, wenn es auf die gewünschten Methoden reagiert, gibt es keinen Grund, den Typ genau zu bestimmen.
Ist beispielsweise
object.is_a?(String)
zu starr, da eine andere Klasse möglicherweise Methoden implementiert, die sie in eine Zeichenfolge konvertieren, oder dafür sorgt, dass sie sich identisch mit dem Verhalten von Zeichenfolgen verhält.object.respond_to?(:to_s)
Dies wäre ein besserer Weg, um zu testen, ob das betreffende Objekt das tut, was Sie wollen.quelle
#class
gibt nicht den Typ des Objekts zurück, sondern seine Klasse . Der Name sollte ein totes Werbegeschenk sein. Klasse und Typ sind zwei völlig unterschiedliche Konzepte in OO.typeof
C, JavaScript und andere am nächsten dranclass
. In Ruby gibt es kein formales Protokollsystem wie in anderen Sprachen, wobei Objective-C der engste Smalltalk-Verwandte ist. Wenn Sie "Typ" als "Objekt definieren, das auf einen bestimmten Satz von Methoden mit akzeptablen Ergebnissen reagiert", gibt es wirklich keine Möglichkeit, dies zu behaupten. Es ist einfach zu locker. Wenn Sie sich in Ruby meistens auf den Typ eines Objekts beziehen, wird davon ausgegangen, dass Sie über die Klasse sprechen. Genau aus diesem Grund habe ich den Begriff Typ in Anführungszeichen verwendet.int i
" oder "Integer j
".) Tadman beantwortete die Frage auf eine Weise, die beide Fragesteller zufrieden zu stellen schien und das allgemeine Publikum, während die von Ruby verwendete Terminologie geklärt wird. Ich habe kein Interesse daran, mich über die Feinheiten der objektorientierten Terminologie hinweg akademisch zu spalten. Bitte haben Sie das letzte Wort.Sie könnten auch versuchen:
instance_of?
quelle
In Ruby ist es Ihnen oft egal, was die Klasse des Objekts an sich ist, es ist Ihnen nur wichtig, 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 ist es am besten, Duck Typing zu verwenden, indem Sie
#respond_to?(method)
:quelle
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 versucht, uns zu vermitteln. Warum hätte dann jemand "Alles ist ein Objekt" gesagt? 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 interessiert sich nicht so sehr für den Objekttyp, nur für die Klasse. Wir verwenden Klassen, keine Typen. Alle Daten haben dann eine Klasse.
Sie können auch Vorfahren haben
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. Dort wird der "Datentyp" benötigt. Wenn Sie wirklich ins Detail gehen möchten, schauen Sie nach ...
"Das Ruby-Objektmodell"
Dies ist der Begriff für den Umgang von Ruby mit Objekten. 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 haben Typen. Wenn Sie sich mit Datenbanken auskennen, wissen Sie, dass es nur eine begrenzte Anzahl von Typen gibt.
Text blockiert Zahlen
quelle
Object.ancestors # => [Object, Kernel, BasicObject]