Qual è la differenza? Quando dovrei usare quale? Perché ce ne sono così tanti?
Qual è la differenza? Quando dovrei usare quale? Perché ce ne sono così tanti?
Risposte:
kind_of?
e is_a?
sono sinonimi.
instance_of?
è diverso dagli altri due in quanto restituisce solo true
se l'oggetto è un'istanza di quella classe esatta, non una sottoclasse.
Esempio:
"hello".is_a? Object
e "hello".kind_of? Object
return true
perché "hello"
è a String
ed String
è una sottoclasse di Object
."hello".instance_of? Object
ritorna false
.@honda.kind_of? Car
e @person.is_a? Administrator
, Ruby è tutto sull'estetica. In effetti, nota l'errore grammaticale ... con il supporto attivo puoi scrivere @person.is_an? Administrator
:) ... Questo potrebbe essere diventato nel nucleo di Ruby ormai, in realtà.
kind_of?
ma no is_a?
?
is_an?
non è in ruby-1.9.2-p0. @Claudiu, no. is_a?
è solo un alias dikind_of?
. Entrambi i metodi invocare la stessa funzione c, rb_obj_is_kind_of
.
kind_of?
senza eseguire l' override is_a?
.
is_an?
metodo ActiceSupport ?! Non è nella versione corrente delle rotaie e non riesco a trovare nulla su Google che sia deprecato.
Qual è la differenza?
Dalla documentazione:
- - ( Booleano )
instance_of?(class)
- Restituisce
true
ifobj
è un'istanza di una determinata classe.
e:
- - ( Booleano )
is_a?(class)
- ( Booleano )kind_of?(class)
- Restituisce
true
ifclass
è la classe diobj
, o ifclass
è una delle superclassi diobj
o dei moduli inclusi inobj
.
Se ciò non è chiaro, sarebbe bello sapere cosa non è esattamente chiaro, in modo che la documentazione possa essere migliorata.
Quando dovrei usare quale?
Mai. Usa invece il polimorfismo.
Perché ce ne sono così tanti?
Non chiamerei due "molti". Ce ne sono due, perché fanno due cose diverse.
È più simile a Ruby chiedere agli oggetti se rispondono a un metodo che ti serve o meno, usando respond_to?
. Ciò consente sia un'interfaccia minima che un'implementazione inconsapevole.
Ovviamente non è sempre applicabile, quindi c'è ancora la possibilità di chiedere una comprensione più conservativa del "tipo", che è una classe o una classe base, usando i metodi di cui stai chiedendo.
Inoltre non chiamerei due molti ( is_a?
e kind_of?
sono alias dello stesso metodo), ma se vuoi vedere più possibilità, rivolgi la tua attenzione al #class
metodo:
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?
edkind_of?
esistono: suppongo che faccia parte della filosofia progettuale di Ruby. Python direbbe che dovrebbe esserci solo un modo per fare qualcosa; Ruby ha spesso anche dei metodi, quindi puoi usare quello che suona meglio. È una questione di preferenza. Potrebbe essere in parte dovuto all'influenza giapponese: mi hanno detto che useranno una parola diversa per lo stesso numero a seconda della frase per renderla più piacevole. Matz potrebbe aver portato quell'idea nel suo linguaggio.