Variabilele globale sunt variabile care poate fi accesat de oriunde în program, indiferent de domeniul de aplicare. Acestea sunt notate începând cu un caracter $ (semn dolar). Cu toate acestea, utilizarea de variabile globale este adesea considerată „un-Ruby”, iar rareori le veți vedea.
Definirea variabilelor globale
Variabilele globale sunt definite și utilizate ca orice altă variabilă. Pentru a le defini, pur și simplu alocați o valoare și începeți să le utilizați. Dar, după cum sugerează și numele lor, atribuirea unor variabile globale din orice punct al programului are implicații globale. Următorul program demonstrează acest lucru. Metoda va modifica o variabilă globală și va afecta modul în care al doilea metoda rulează.
viteza $ = 10. def accelera. viteza $ = 100. Sfârșit. def pass_speed_trap. dacă viteza $> 65. # Dă programului un bilet rapid. Sfârșit. Sfârșit. accelera. pass_speed_trap.
Nepopular
Deci, de ce este „un-Ruby” și de ce nu vezi variabile globale foarte des? Simplu, rupe încapsularea. Dacă oricare dintre clase sau metode poate modifica starea variabilelor globale, fără niciun strat de interfață alte clase sau metode care se bazează pe acea variabilă globală se pot comporta în mod neașteptat și nedorit manieră. Mai mult, astfel de interacțiuni pot fi foarte dificil de depanat. Ce a modificat acea variabilă globală și când? Veți căuta destul de multe coduri pentru a afla ce a făcut acest lucru și asta ar fi putut fi evitat prin a nu încălca regulile de încapsulare.
Dar asta nu înseamnă că variabilele globale sunt nu folosit în Rubin. Există o serie de variabile globale speciale cu nume de un singur caracter (a-la Perl) care poate fi utilizat pe tot parcursul programului. Ele reprezintă starea programului în sine și fac lucruri precum modificarea separatoarelor de înregistrare și a câmpurilor pentru toți devine metode.
Variabile globale
- $0 - Această variabilă, notată cu $ 0 (adică zero), ține numele scriptului de nivel superior care este executat. Cu alte cuvinte, fișierul script care a fost rulat de la Linie de comanda, nu fișierul script care deține codul care execută în prezent. Astfel, dacă script1.rb a fost rulat de pe linia de comandă, va ține script1.rb. Dacă acest script necesită script2.rb, 0 $ în acel fișier script ar fi de asemenea script1.rb. Numele $ 0 reflectă convenția de denumire folosită în scripturile shell UNIX în același scop.
- $* - Argumentele din linia de comandă dintr-un tablou notate cu $ * (semn dolar și asterisc). De exemplu, dacă ar fi să alergi ./script.rb arg1 arg2, atunci $ * ar fi echivalent cu % w {arg1 arg2}. Acest lucru este echivalent cu specialul argv matrice și are un nume mai puțin descriptiv, deci este rar utilizat.
- $$ - ID-ul procesului interpretului, notat cu $$ (semnele în două dolari). Cunoașterea propriului ID de proces este adesea utilă în programele daemon (care rulează în fundal, neasociat de orice terminal) sau servicii de sistem. Totuși, acest lucru se complică puțin atunci când sunt implicate fire, așa că aveți grijă să-l utilizați orb.
- $ / și $ \ - Acestea sunt separatoarele de înregistrare de intrare și ieșire. Când citiți obiecte folosind devine și tipăriți-le folosind puts, le folosește pentru a ști când a fost citită o „înregistrare” completă sau ce să imprimați între mai multe înregistrări. În mod implicit, acestea ar trebui să fie caracterul newline. Dar, întrucât acestea afectează comportamentul tuturor obiectelor IO, sunt rareori folosite, dacă nu. Puteți să le vedeți în scripturi mai mici, unde încălcarea regulilor de încapsulare nu este o problemă.
- $? - Starea de ieșire a ultimului proces copil executat. Dintre toate variabilele enumerate aici, aceasta este probabil cea mai utilă. Motivul pentru asta este simplu: nu puteți obține starea de ieșire a proceselor copilului prin valoarea lor de retur din sistem metodă, numai adevărat sau fals. Dacă trebuie să cunoașteți valoarea efectivă a randamentului procesului copil, trebuie să utilizați această variabilă globală specială. Din nou, numele acestei variabile este preluat de la shell-urile UNIX.
- $_ - Ultimul șir citit de devine. Această variabilă poate fi un punct de confuzie pentru cei care vin la Ruby de la Perl. În Perl, $ _ variabilă înseamnă ceva similar, dar total diferit. În Perl, $_ deține valoarea ultimei declarații și în Ruby deține șirul returnat de precedent devine invocare. Utilizarea lor este similară, dar ceea ce dețin cu adevărat este foarte diferit. De multe ori nici nu vezi această variabilă (să te gândești la ea, vezi rareori oricare dintre aceste variabile), dar este posibil să le vezi în programele Ruby foarte scurte care procesează textul.
Pe scurt, rar veți vedea variabile globale. Adesea sunt o formă proastă (și „un-Ruby”) și sunt cu adevărat utile doar în scripturi foarte mici, unde implicația deplină a utilizării lor poate fi pe deplin apreciată. Există câteva variabile globale speciale care pot fi utilizate, dar în mare parte nu sunt utilizate. Nu trebuie să știi cu adevărat toate atât despre variabilele globale pentru a înțelege majoritatea programelor Ruby, dar cel puțin ar trebui să știi că există.