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 Integere Float. Também funciona para Decimal? (as sublime texto intérprete destaca a sintaxe de forma diferente para Decimalo 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?).
foovai ser tanto true, falseou 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_ofmais 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 Objectclasse, 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