Qual é a diferença? Quando devo usar qual? Por que existem tantos?
ruby
inheritance
introspection
Claudiu
fonte
fonte
is_a?
ekind_of?
existir: suponho que seja parte da filosofia de design de Ruby. Python diria que deve haver apenas uma maneira de fazer algo; O Ruby geralmente possui métodos sinônimos, para que você possa usar o que soa melhor. É uma questão de preferência. Pode ser em parte devido à influência japonesa: me disseram que eles usarão uma palavra diferente para o mesmo número, dependendo da frase, a fim de torná-la mais agradável. Matz pode ter levado essa ideia ao seu design de linguagem.Respostas:
kind_of?
eis_a?
são sinônimos.instance_of?
é diferente dos outros dois, pois só retornatrue
se o objeto for uma instância dessa classe exata, não uma subclasse.Exemplo:
"hello".is_a? Object
e"hello".kind_of? Object
retornartrue
porque"hello"
é umString
eString
é uma subclasse deObject
."hello".instance_of? Object
retornafalse
.fonte
@honda.kind_of? Car
e@person.is_a? Administrator
, Ruby, tudo sobre estética. Na verdade, observe o erro gramatical ... com suporte ativo, você pode escrever@person.is_an? Administrator
:) ... Isso pode ter chegado ao núcleo do Ruby agora.kind_of?
mas nãois_a?
?is_an?
não está no ruby-1.9.2-p0. @ Claudiu, não.is_a?
é apenas um apelido dekind_of?
. Ambos os métodos invocam a mesma função crb_obj_is_kind_of
,.kind_of?
sem substituiris_a?
.is_an?
método ActiceSupport ?! Não está na versão atual dos trilhos, e também não consigo encontrar nada no google sobre isso.A partir da documentação:
e:
Se isso não estiver claro, seria bom saber exatamente o que não está claro, para que a documentação possa ser aprimorada.
Nunca. Use polimorfismo em seu lugar.
Eu não chamaria dois "muitos". Existem dois deles, porque eles fazem duas coisas diferentes.
fonte
É mais parecido com Ruby perguntar aos objetos se eles respondem a um método que você precisa ou não, usando
respond_to?
. Isso permite que a interface e a implementação mínima sejam inconscientes.Nem sempre é aplicável, é claro, portanto, ainda existe a possibilidade de perguntar sobre um entendimento mais conservador do "tipo", que é classe ou classe base, usando os métodos que você está perguntando.
fonte
Eu também não chamaria dois muitos (
is_a?
ekind_of?
são aliases do mesmo método), mas se você quiser ver mais possibilidades, volte sua atenção para o#class
método:fonte