Y a-t-il quelque chose de plus idiomatique que ce qui suit?
foo.class == String
ruby
idioms
typechecking
davidchambers
la source
la source
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_principleString
, mais aussi avecInteger
etFloat
. Cela fonctionne-t-il aussi pourDecimal
? (l'interprète de texte sublime met en évidence la syntaxe différemment pourDecimal
ce qui me rend suspect)Une approche plus typée canard serait de dire
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?).la source
foo
seront soittrue
,false
ou une chaîne de vanille, mais il est bon d'apprendre des solutions plus générales.to_str
, outo_s
? Les deux sont légèrement différents.Tu peux faire:
Et le plus général:
la source
kind_of
plus général? Ils semblent être synonyme:is_a
.instance_of?
au lieu deis_a?
.ou
si vous ne vous souciez que si elle est dérivée de
String
quelque part dans sa chaîne d'héritagela source
En plus des autres réponses, Class définit la méthode === pour tester si un objet est une instance de cette classe.
la source
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».
Le moyen de frappe le plus canard;)
la source
"string".is_a?(String)
. Il semble que vous réinventez la roue. Il y a aussiclass
,instance_of
,kind_of
, etc ... mauvaise idée de patch singe laObject
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.