Existe algo mais idiomático do que o seguinte?
foo.class == String
Existe algo mais idiomático do que o seguinte?
foo.class == String
Respostas:
Eu acho que você está procurando instance_of?
. is_a?
e kind_of?
retornará true para instâncias de classes 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
, mas também com Integer
e Float
. Também funciona para Decimal
? (as sublime texto intérprete destaca a sintaxe de forma diferente para Decimal
o que me faz suspeitar)
Uma abordagem mais tipográfica seria dizer
foo.respond_to?(:to_str)
to_str
indica que a classe de um objeto pode não ser um descendente real da String, mas o próprio objeto é muito parecido com uma string (string?).
foo
vai ser tanto true
, false
ou uma cadeia de baunilha, mas é bom para aprender soluções mais gerais.
to_str
, ou to_s
? Os dois são um pouco diferentes.
Você pode fazer:
foo.instance_of?(String)
E o mais geral:
foo.kind_of?(String)
kind_of
mais geral? Eles parecem ser sinónimo: is_a
.
instance_of?
vez de is_a?
.
Além das outras respostas, Class define o método === para testar se um objeto é uma instância dessa classe.
Eu acho que uma maneira melhor é criar alguns métodos predicados. Isso também salvará seu "Ponto Único de Controle".
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
A maneira mais digitação de pato;)
"string".is_a?(String)
? Parece que você está reinventando a roda. Há também class
, instance_of
, kind_of
, etc ... Bad idéia para monkey patch da Object
classe, para não mencionar que é desnecessário.
pre_check("test".is_string?)
Agora, o requisito do seu projeto mudará e cada String com três caracteres ou mais não será mais definida como String (sei que é incomum;)) Agora você pode alterar seu próprio método facilmente.
is_a?
é realmente o idioma mais apropriado a ser usado (e muitas vezes uma verificação de digitação de pato como Andrew Grimm menciona é ainda melhor). Uma comparação estrita de classe geralmente é um cheiro de código. en.wikipedia.org/wiki/Liskov_substitution_principle