Qual é a diferença? Quando devo usar qual? Por que existem tantos?
Qual é a diferença? Quando devo usar qual? Por que existem tantos?
Respostas:
kind_of?
e is_a?
são sinônimos.
instance_of?
é diferente dos outros dois, pois só retorna true
se o objeto for uma instância dessa classe exata, não uma subclasse.
Exemplo:
"hello".is_a? Object
e "hello".kind_of? Object
retornar true
porque "hello"
é um String
eString
é uma subclasse de Object
."hello".instance_of? Object
retorna false
.@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ão is_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 c rb_obj_is_kind_of
,.
kind_of?
sem substituir is_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.
Qual é a diferença?
A partir da documentação:
- - ( Booleano )
instance_of?(class)
- Retorna
true
seobj
é uma instância da classe especificada.
e:
- - ( Booleano )
is_a?(class)
- ( Booleano )kind_of?(class)
- Retorna
true
ifclass
é a classe deobj
, ou seclass
é uma das superclasses deobj
ou módulos incluídos emobj
.
Se isso não estiver claro, seria bom saber exatamente o que não está claro, para que a documentação possa ser aprimorada.
Quando devo usar qual?
Nunca. Use polimorfismo em seu lugar.
Por que existem tantos?
Eu não chamaria dois "muitos". Existem dois deles, porque eles fazem duas coisas diferentes.
É 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.
Eu também não chamaria dois muitos ( is_a?
e kind_of?
são aliases do mesmo método), mas se você quiser ver mais possibilidades, volte sua atenção para o #class
método:
A = Class.new
B = Class.new A
a, b = A.new, B.new
b.class < A # true - means that b.class is a subclass of A
a.class < B # false - means that a.class is not a subclass of A
# Another possibility: Use #ancestors
b.class.ancestors.include? A # true - means that b.class has A among its ancestors
a.class.ancestors.include? B # false - means that B is not an ancestor of a.class
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.