¿Hay algo más idiomático que lo siguiente?
foo.class == String
¿Hay algo más idiomático que lo siguiente?
foo.class == String
Respuestas:
Creo que estás buscando instance_of?
. is_a?
y kind_of?
devolverá verdadero para instancias de clases derivadas.
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
, sino también con Integer
y Float
. ¿También funciona para Decimal
? (el intérprete más destacado de texto sublime la sintaxis diferente para Decimal
lo que me hace sospechar)
Un enfoque más tipo pato sería decir
foo.respond_to?(:to_str)
to_str
indica que la clase de un objeto puede no ser un descendiente real de String, pero el objeto en sí es muy parecido a una cadena (¿fibroso?).
foo
o bien habrá true
, false
o una cadena de vainilla, pero es bueno aprender soluciones más generales.
to_str
o to_s
? Los dos son ligeramente diferentes.
Tu puedes hacer:
foo.instance_of?(String)
Y el más general:
foo.kind_of?(String)
kind_of
más general? Parecen ser sinónimo: is_a
.
instance_of?
lugar de is_a?
.
Además de las otras respuestas, Class define el método === para probar si un objeto es una instancia de esa clase.
Creo que una mejor manera es crear algunos métodos predicados. Esto también guardará su "Punto único de control".
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
La forma de escribir más pato;)
"string".is_a?(String)
. Parece que estás reinventando la rueda. También hay class
, instance_of
, kind_of
, etc ... mala idea parche mono de la Object
clase, por no hablar de que es innecesario.
pre_check("test".is_string?)
Ahora el requisito de su proyecto cambiará y cada String con tres caracteres o más ya no se define como String (sé que es inusual;)) Ahora puede cambiar su propio método fácilmente.
is_a?
es en realidad el idioma más apropiado para usar (y a menudo una verificación de tipeo como Andrew Grimm es incluso mejor). Una comparación de clases estricta suele ser un olor a código. en.wikipedia.org/wiki/Liskov_substitution_principle