Y a-t-il quelque chose de plus idiomatique que ce qui suit?
foo.class == String
Y a-t-il quelque chose de plus idiomatique que ce qui suit?
foo.class == String
Réponses:
Je pense que vous recherchez instance_of?
. is_a?
et kind_of?
retournera true pour les instances de classes dérivées.
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
, mais aussi avec Integer
et Float
. Cela fonctionne-t-il aussi pour Decimal
? (l'interprète de texte sublime met en évidence la syntaxe différemment pour Decimal
ce qui me rend suspect)
Une approche plus typée canard serait de dire
foo.respond_to?(:to_str)
to_str
indique que la classe d'un objet n'est peut-être pas un descendant réel de String, mais que l'objet lui-même ressemble beaucoup à une chaîne (stringy?).
foo
seront soit true
, false
ou une chaîne de vanille, mais il est bon d'apprendre des solutions plus générales.
to_str
, ou to_s
? Les deux sont légèrement différents.
Tu peux faire:
foo.instance_of?(String)
Et le plus général:
foo.kind_of?(String)
kind_of
plus général? Ils semblent être synonyme: is_a
.
instance_of?
au lieu de is_a?
.
En plus des autres réponses, Class définit la méthode === pour tester si un objet est une instance de cette classe.
Je pense qu'une meilleure façon est de créer des méthodes de prédicat. Cela permettra également de sauvegarder votre «point de contrôle unique».
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
Le moyen de frappe le plus canard;)
"string".is_a?(String)
. Il semble que vous réinventez la roue. Il y a aussi class
, instance_of
, kind_of
, etc ... mauvaise idée de patch singe la Object
classe, pour ne pas mentionner qu'il est inutile.
pre_check("test".is_string?)
Maintenant, les exigences de votre projet vont changer et chaque chaîne de trois caractères ou plus n'est plus définie comme chaîne (je sais que c'est inhabituel;)) Vous pouvez maintenant changer votre propre méthode facilement.
is_a?
est en fait l'idiome le plus approprié à utiliser (et souvent une vérification de type canard comme Andrew Grimm le mentionne est encore meilleure). Une comparaison de classe stricte est généralement une odeur de code. en.wikipedia.org/wiki/Liskov_substitution_principle