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 truese l'oggetto è un'istanza di quella classe esatta, non una sottoclasse.
Esempio:
"hello".is_a? Objecte "hello".kind_of? Objectreturn trueperché "hello"è a Stringed Stringè una sottoclasse di Object."hello".instance_of? Objectritorna false.@honda.kind_of? Care @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
trueifobjè un'istanza di una determinata classe.
e:
- - ( Booleano )
is_a?(class)
- ( Booleano )kind_of?(class)- Restituisce
trueifclassè la classe diobj, o ifclassè una delle superclassi diobjo 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 #classmetodo:
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.