Am'll folosi python ca un exemplu de ceea ce am'm în căutarea pentru (vă puteți gândi la ea ca pseudocod dacă nu't știu Python):
>>> a = 1
>>> type(a)
<type 'int'>
Știu că în ruby pot face :
1.9.3p194 :002 > 1.class
=> Fixnum
Dar acest lucru este modul corect de a determina tipul de obiect?
Modul corect de a determina "tip" de un obiect, care este un vechi termen în lume Ruby, este de a apela object.class
.
Deoarece clasele pot moșteni de la alte clase, dacă doriți pentru a determina dacă un obiect este "de un anumit tip" s-ar putea numi obiect.is_a?(Code) pentru a vedea dacă
obiecteste de tip
Code` sau derivate din acesta.
În mod normal, tip de verificare nu este făcut în Ruby, dar în loc de obiecte sunt evaluate în funcție de capacitatea lor de a răspunde la anumite metode, de obicei numit "Duck typing". Cu alte cuvinte, dacă acesta răspunde la metode vrei, nu's nici un motiv să fie special despre tip.
De exemplu, obiect.is_a?(Șir)
este prea rigid, deoarece o altă clasă ar putea să pună în aplicare metode care transformă într-un șir de caractere, sau să se comporte identic cu modul în Șir se comportă. `obiect.respond_to?(:to_s) ar fi o modalitate mai bună de a testa că obiectul în cauză face ceea ce vrei.
ai putea încerca, de asemenea,: instance_of?
p 1.instance_of? Fixnum #=> True
p "1".instance_of? String #=> True
p [1,2].instance_of? Array #=> True
De multe ori în Ruby, nu't de fapt pasă ce obiect's class este, per se, ai grijă ca aceasta răspunde la o anumită metodă. Acest lucru este cunoscut sub numele de Duck Typing și te'll vedea în tot felul de Ruby codebases.
Deci, în multe (dacă nu majoritatea) de cazuri, cel mai bine să utilizați Duck Typing folosind #respond_to?(metoda)
:
object.respond_to?(:to_i)
Aș spune "Da". Ca "Matz" a spus ceva de genul asta într-una din discuțiile sale, "Ruby obiecte nu au tipuri." Nu toate, dar o parte că el este încercarea de a obține de pe la noi. De ce ar avea cineva a spus "Totul este un Obiect" atunci? Pentru a adăuga el a spus "de Date a Tipurilor nu obiecte".
Deci s-ar putea bucura de acest lucru.
Dar Ruby nu't le pasa prea mult de tipul de obiect doar clasa. Vom folosi clase nu tipuri. Toate datele atunci are o clasă.
12345.class
'my string'.class
Ele pot avea, de asemenea, strămoșii
Object.ancestors
Ei au, de asemenea, meta clase dar am'll salva detaliile pe care.
Odată ce știi tu'll fi capabil de a lookup ce metode pot folosi pentru asta. Ca's în cazul în care "tip de date" este nevoie. Dacă într-adevăr vreau să intru în detalii privirea de sus...
"Ruby Object Model"
Acesta este termenul folosit pentru cât de Rubin se ocupă de obiecte. L's toate internă, astfel încât să don't vedea într-adevăr mult de acest lucru, dar l's frumos să știi. Dar asta's un alt subiect.
Da! Clasa este de tipul de date. Obiectele au clase de date și a tipurilor. Deci, dacă știți despre baze de date atunci știi că nu sunt doar un set finit de tipuri.
blocuri de text numere