01
din 02
Instantarea și metoda de inițializare

Când definiți o clasă în Ruby, Ruby va atribui un nou obiect de clasă constanta numelui clasei. De exemplu, dacă ar fi să spui Persoana clasei; Sfârșit, acest lucru este aproximativ echivalent cu Persoana = clasa nouă. Acest obiect de clasă este de tip Clasă, și deține o serie de metode utile pentru realizarea de cazuri de copii ale acestor instanțe.
02
din 02
Efectuarea instanțelor
Pentru a crea o nouă instanță a unei clase, apelați-o nou metodă. În mod implicit, aceasta va aloca memoria necesară clasei și va returna o referință la noul obiect. Deci, dacă ar trebui să faceți o nouă instanță a Persoană clasa, ai suna Person.new.
Deși la început acest lucru pare puțin înapoi, nu există nou cuvânt cheie în ruby sau orice sintaxă specială. Obiectele noi sunt create printr-o metodă normală, care, totul spus și făcut, face lucruri relativ simple.
Inițializarea instanțelor
Un obiect gol nu este foarte interesant. Pentru a începe să folosiți obiectul dvs., acesta trebuie inițializat (presupunând că are vreunul
variabile de instanta care are nevoie de inițializare). Acest lucru se realizează prin intermediul Initialize metodă. Ruby va transmite orice argumente pe care le transmiteți SomeClass.new pe la Initialize pe noul obiect. Puteți utiliza apoi atribuții și metode variabile normale pentru inițializarea stării obiectului. În acest exemplu, a Persoană este prezentată clasa a cărei Initialize metoda va lua un argument de nume și vârstă și le va atribui variabilelor de instanță.clasă Persoană def inițializare (nume, vârstă) @ nume, @age = nume, sfârșit de vârstă bob = Person.new ('Bob', 34)
De asemenea, puteți utiliza această oportunitate pentru a achiziționa orice resurse de care aveți nevoie. Rețea deschisă prize, deschideți fișierele, citiți orice date aveți nevoie etc. Singura avertizare este că oamenii, în general, nu se așteaptă Initialize metodele de a eșua. Asigurați-vă că documentați eventual eșecul Initialize metode temeinice.
Distrugerea obiectelor
În general, nu distrugi obiecte din Ruby. Dacă vii din C ++ sau din altă limbă fără un colector de gunoi, acest lucru ar putea părea ciudat. Dar în rubin (și în majoritatea celorlalte limbi colectate de gunoi), nu distrugeți obiecte, pur și simplu încetați să faceți referire la el. La următorul ciclu de colectare a gunoiului, orice obiect fără nimic care se referă la acesta va fi distrus automat. Există câteva erori cu referințe circulare, dar, în general, acest lucru funcționează perfect și nici măcar nu aveți nevoie de un „distrugător”.
Dacă vă întrebați despre resurse, nu vă faceți griji. Când obiectul care deține resursa este distrus, resursa va fi eliberată. Fișierele deschise și conexiunile la rețea vor fi închise, memoria va fi alocată etc. Doar dacă alocați resurse într-o extensie C, va trebui să vă faceți griji cu privire la redistribuirea resurselor. Deși nu există nicio garanție cu privire la funcționarea colectorului de gunoi. Pentru a aloca resurse într-o oportun încercați să le eliberați manual.
Realizarea copiilor obiectelor
Ruby este trecut prin referință. Dacă treceți o referință la un obiect la a metodă, iar acea metodă apelează la o metodă care modifică starea acelui obiect, pot apărea consecințe nedorite. Mai mult, metodele pot apoi să salveze referința la obiect pe care să o modifice mult mai târziu, provocând un efect întârziat pentru eroare. Pentru a evita acest lucru, Ruby oferă câteva metode de duplicare a obiectelor.
Pentru a dubla orice obiect, pur și simplu sunați la some_object.dup metodă. Un nou obiect va fi alocat și toate variabilele de instanță ale obiectului vor fi copiate. Cu toate acestea, copierea variabilelor de instanță este ceea ce trebuia să evite: aceasta este ceea ce se numește "copie superficială". Dacă trebuia să dețineți un fișier într-o variabilă de instanță, ambele obiecte duplicate se vor referi acum la același lucru fişier.
Trebuie doar să știți că aceste copii sunt copii superficiale înainte de a utiliza DUP metodă. Vezi articolul Realizarea copiilor adânci în rubin pentru mai multe informatii.