Variabile de instanță în Ruby

Variabilele de instanță încep cu un semn (@) și pot fi referite doar în cadrul metodelor clasei. Ele diferă de variabilele locale prin faptul că nu există în nicio anumită domeniu. În schimb, o tabelă variabilă similară este stocată pentru fiecare instanță a unei clase. Variabilele de instanță trăiesc în cadrul unei instanțe de clasă, atât timp cât acea instanță rămâne în viață, la fel și variabilele de instanță.

Variabilele de instanță pot fi trimise în orice metodă a clasei respective. Toate metodele unei clase folosesc aceeași instanță tabel variabil, spre deosebire de variabilele locale unde fiecare metodă va avea un tabel de variabile diferite. Este posibil să accesați variabile de instanță fără a le defini mai întâi. Aceasta nu va ridica o excepție, dar valoarea variabilei va fi zero și un avertisment va fi emis dacă ați rulat Ruby cu -w intrerupator.

Acest exemplu demonstrează utilizarea variabilelor de instanță. Rețineți că shebang conține -w comutator, care va imprima avertismente în cazul în care acestea apar. De asemenea, rețineți utilizarea incorectă în afara unei metode din sfera clasei. Acest lucru este incorect și discutat mai jos.

instagram viewer

De ce este @Test variabil incorect? Aceasta are legătură cu domeniul de aplicare și modul în care Ruby pune în aplicare lucrurile. În cadrul unei metode, domeniul variabilului de instanță se referă la instanța particulară a clasei respective. Cu toate acestea, în domeniul clasei (în interiorul clasei, dar în afara oricărei metode), domeniul de aplicare este instanta clasei domeniul de aplicare. Ruby pune în aplicare ierarhia de clase, instantaneu Clasă obiecte, deci există un a doua instanta la joc aici. Primul instanță este o instanță a Clasă clasa, și aici este locul @Test va merge. A doua instanță este instantanarea TestClass, și aici este locul @valoare va merge. Acest lucru devine un pic confuz, dar amintiți-vă doar să nu folosiți niciodată @variabile de instanta în afara metodelor. Dacă aveți nevoie de spațiu de stocare la nivel de clasă, utilizați @@ class_variables, care poate fi folosit oriunde în sfera clasei (în interiorul sau în afara metodelor) și se va comporta la fel.

În mod normal, nu puteți accesa variabile de instanță din afara unui obiect. De exemplu, în exemplul de mai sus, nu puteți apela pur și simplu t.value sau t. @ valoare pentru a accesa variabila instanță @valoare. Acest lucru ar încălca regulile din încapsulare. Acest lucru este valabil și pentru cazuri de clase de copii, ele nu pot accesa variabile de instanță aparținând clasei părinte, chiar dacă din punct de vedere tehnic sunt de același tip. Deci, pentru a oferi acces la variabile de instanță, accessor metodele trebuie declarate.

Următorul exemplu demonstrează modul în care metodele de accesor pot fi scrise. Cu toate acestea, rețineți că Rubin furnizează o scurtătură și că acest exemplu există doar pentru a vă arăta cum funcționează metodele de accesorizare. În general, nu este obișnuit să vezi metodele accesorilor scrise în acest mod, dacă nu este nevoie de un fel de logică suplimentară pentru accesor.

Comenzile rapide fac lucrurile un pic mai ușoare și mai compacte. Există trei dintre aceste metode de ajutor. Ele trebuie să fie executate în cadrul clasei (în interiorul clasei, dar în afara oricărei metode) și vor defini în mod dinamic metode la fel ca metodele definite în exemplul de mai sus. Aici nu se întâmplă nicio magie și arată ca niște cuvinte cheie de limbă, dar chiar sunt metode de definire dinamică. De asemenea, acești accesori merg de obicei în partea de sus a clasei. Acest lucru oferă cititorului o imagine de ansamblu instantanee a variabilelor de membru care vor fi disponibile în afara clasei sau a claselor pentru copii

Există trei dintre aceste metode de accesorizare. Fiecare ia o listă de simboluri care descrie variabilele de instanță care trebuie accesate.

  • attr_reader - Definiți metode de „cititor”, cum ar fi Nume metoda din exemplul de mai sus.
  • attr_writer - Definiți metode „scriitor” cum ar fi = vârstă metoda din exemplul de mai sus.
  • attr_accessor - Definiți metodele „cititorului” și „scriitorului”.

Când să utilizați variabile de instanță

Acum că știți ce variabile de instanță sunt, când le utilizați? Variabilele de instanță trebuie utilizate atunci când reprezintă starea obiectului. Numele și vârsta unui elev, notele acestora etc. Acestea nu trebuie utilizate pentru stocarea temporară, pentru asta sunt variabile locale. Cu toate acestea, acestea ar putea fi eventual utilizate pentru stocarea temporară între apelurile la metodă pentru calcule cu mai multe etape. Cu toate acestea, dacă faceți acest lucru, poate doriți să vă regândiți compoziția metodei și să le transformați în variante în parametri de metodă.

instagram story viewer