Gibt es etwas Idiomatischeres als das Folgende?
foo.class == String
Gibt es etwas Idiomatischeres als das Folgende?
foo.class == String
Antworten:
Ich denke du suchst instance_of?
. is_a?
und kind_of?
gibt true für Instanzen aus abgeleiteten Klassen zurück.
class X < String
end
foo = X.new
foo.is_a? String # true
foo.kind_of? String # true
foo.instance_of? String # false
foo.instance_of? X # true
String
, sondern auch mit Integer
und Float
. Funktioniert es auch für Decimal
? (Der erhabene Textinterpreter hebt die Syntax anders hervor Decimal
, was mich misstrauisch macht)
Ein Ansatz, bei dem mehr Enten geschrieben werden, wäre zu sagen
foo.respond_to?(:to_str)
to_str
gibt an, dass die Klasse eines Objekts möglicherweise kein tatsächlicher Nachkomme des Strings ist, das Objekt selbst jedoch sehr stringartig (stringy?) ist.
foo
entweder sein true
, false
oder eine Vanille-Saite, aber es ist gut allgemeinere Lösungen zu erfahren.
to_str
oder to_s
? Die beiden sind etwas unterschiedlich.
Du kannst tun:
foo.instance_of?(String)
Und das allgemeinere:
foo.kind_of?(String)
kind_of
allgemeiner? Sie scheinen synonym zu sein : is_a
.
instance_of?
statt is_a?
.
Zusätzlich zu den anderen Antworten definiert Class die Methode ===, um zu testen, ob ein Objekt eine Instanz dieser Klasse ist.
Ich denke, ein besserer Weg ist es, einige Prädikatmethoden zu erstellen. Dadurch wird auch Ihr "Single Point of Control" gespeichert.
class Object
def is_string?
false
end
end
class String
def is_string?
true
end
end
print "test".is_string? #=> true
print 1.is_string? #=> false
Je mehr Enten tippen;)
"string".is_a?(String)
. Es scheint, als würden Sie das Rad neu erfinden. Es gibt auch class
, instance_of
, kind_of
usw ... Schlechte Idee zu Affen - Patch der Object
Klasse, nicht zu erwähnen , es unnötig ist.
pre_check("test".is_string?)
Jetzt ändert sich Ihre Projektanforderung und jeder String mit drei oder mehr Zeichen wird nicht mehr als String definiert (ich weiß, dass es ungewöhnlich ist;)). Jetzt können Sie Ihre eigene Methode einfach ändern.
is_a?
tatsächlich die geeignetere Redewendung verwendet wird (und oft ist eine Überprüfung der Ententypisierung, wie sie Andrew Grimm erwähnt, sogar noch besser). Ein strenger Klassenvergleich ist normalerweise ein Codegeruch. en.wikipedia.org/wiki/Liskov_substitution_principle