I'll verwenden Python als ein Beispiel für was I'm suchen (Sie können es als Pseudocode denken, wenn Sie don't wissen Python):
>>> a = 1
>>> type(a)
<type 'int'>
Ich weiß, in Ruby kann ich :
1.9.3p194 :002 > 1.class
=> Fixnum
Aber ist das der richtige Weg, um den Typ des Objekts zu bestimmen?
Der richtige Weg, um den "Typ" eines Objekts zu bestimmen, was in der Ruby-Welt ein wackeliger Begriff ist, ist der Aufruf von object.class
.
Da Klassen von anderen Klassen erben können, kann man, wenn man feststellen will, ob ein Objekt "von einem bestimmten Typ" ist, object.is_a?(ClassName)
aufrufen, um zu sehen, ob object
vom Typ ClassName
ist oder davon abgeleitet wurde.
Normalerweise wird in Ruby keine Typüberprüfung durchgeführt, sondern Objekte werden anhand ihrer Fähigkeit bewertet, auf bestimmte Methoden zu reagieren, die gemeinhin "Duck typing" genannt werden. Mit anderen Worten: Wenn das Objekt auf die gewünschten Methoden reagiert, gibt es keinen Grund, sich über den Typ Gedanken zu machen.
Zum Beispiel ist object.is_a?(String)
zu starr, da eine andere Klasse Methoden implementieren könnte, die es in eine Zeichenkette umwandeln oder dafür sorgen, dass es sich genauso verhält, wie String sich verhält. Mit object.respond_to?(:to_s)
ließe sich besser testen, ob das betreffende Objekt das tut, was Sie wollen.
Sie könnten auch versuchen: Instanz_von
p 1.instance_of? Fixnum #=> True
p "1".instance_of? String #=> True
p [1,2].instance_of? Array #=> True
Oftmals ist es in Ruby egal, welche Klasse das Objekt hat, es geht nur darum, dass es auf eine bestimmte Methode reagiert. Dies wird als Duck Typing bezeichnet und Sie werden es in allen möglichen Ruby-Codebasen sehen.
In vielen (wenn nicht den meisten) Fällen ist es also am besten, Duck Typing mit #respond_to?(method)
zu verwenden:
object.respond_to?(:to_i)