Variabile globale în rubin

Variabilele globale sunt variabile care pot fi accesate de oriunde în program, indiferent de domeniu de aplicare. Acestea sunt notate începând cu un caracter $ (semn dolar). Cu toate acestea, utilizarea de variabile globale este adesea considerată „un-Ruby” și le veți vedea foarte rar.

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, așa 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ă.

 $ speed = 10 def accelerează $ speed = 100 end def pass_speed_trap dacă $ speed> 65 # Dați programului un bilet de viteză final end accelerate 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 în lipsa unui strat de interfață, orice alte clase sau metode care se bazează pe acea variabilă globală se pot comporta într-un mod neașteptat și nedorit. 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 asta și asta ar fi putut fi evitat prin nerespectarea regulilor 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 pot fi utilizate în întregul program. 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

  • $ cu 0 - Această variabilă, notată cu 0 dolari (este zero), ține numele scriptului de nivel superior care este executat. Cu alte cuvinte, fișierul script care a fost rulat de la linia de comandă, 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. Aceasta este echivalentă cu matricea ARGV specială și are un nume mai puțin descriptiv, deci este rar folosită.
  • $$ - Codul 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 copil prin valoarea lor de retur din metoda sistemului, doar 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, variabila $ _ î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 nu vedeți această variabilă (să vă gândiți la ea, vedeți rareori oricare dintre aceste variabile), dar este posibil să le vedeți î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 prea mult despre variabilele globale pentru a înțelege majoritatea programelor Ruby, dar cel puțin ar trebui să știi că există.