Y a-t-il quelque chose de plus idiomatique que ce qui suit?
foo.class == StringY a-t-il quelque chose de plus idiomatique que ce qui suit?
foo.class == StringRé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       # trueString, mais aussi avec Integeret Float. Cela fonctionne-t-il aussi pour Decimal? (l'interprète de texte sublime met en évidence la syntaxe différemment pour Decimalce 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?).
fooseront soit true, falseou 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_ofplus 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?      #=> falseLe 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 Objectclasse, 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