Variabilă locală - Local variable

În informatică , o variabilă locală este o variabilă căreia i se acordă un domeniu de aplicare local . Referințele variabilelor locale din funcția sau blocul în care este declarată înlocuiesc același nume de variabilă în domeniul mai mare. În limbajele de programare cu doar două niveluri de vizibilitate, variabilele locale sunt contrastate cu variabilele globale . Pe de altă parte, multe limbi derivate de ALGOL permit orice număr de niveluri de vizibilitate imbricate, cu variabile private, funcții, constante și tipuri ascunse în ele, fie prin blocuri imbricate, fie prin funcții imbricate . Variabilele locale sunt fundamentale pentru programarea procedurală și, mai general, programarea modulară : variabilele de domeniu local sunt utilizate pentru a evita problemele cu efecte secundare care pot apărea cu variabilele globale .

Domeniul de aplicare

Variabilele locale pot avea un domeniu lexical sau dinamic , deși domeniul lexical (static) este mult mai comun. În sfera lexicală (sau sfera lexicală; numită și sfera statică sau sfera statică), dacă sfera unui nume de variabilă este un anumit bloc, atunci sfera sa este textul programului definiției blocului: în textul blocului respectiv, numele variabilei există și este legat de valoarea variabilei, dar în afara textului blocului respectiv, numele variabilei nu există. În schimb, în ​​domeniul de aplicare dinamic (sau domeniul de aplicare dinamic), dacă domeniul de aplicare al unei variabile este un anumit bloc, atunci domeniul său de aplicare este acel bloc și toate funcțiile apelate tranzitor de acel bloc (cu excepția cazului în care este suprascris din nou de o altă declarație); după terminarea blocului, numele variabilei nu există. Unele limbi, cum ar fi Perl și Common Lisp , permit programatorului să aleagă scopuri statice sau dinamice la definirea sau redefinirea unei variabile. Exemple de limbi care utilizează scopuri dinamice includ Logo , Emacs lisp și limbile shell bash , dash și declarația „locală” a MirBSD Korn shell ( mksh ). Majoritatea celorlalte limbi oferă variabile locale cu scop lexical.

În majoritatea limbilor, variabilele locale sunt variabile automate stocate direct în teancul de apeluri . Aceasta înseamnă că, atunci când o funcție recursivă se numește, variabilelor locale din fiecare instanță a funcției li se dau adrese distincte . Prin urmare, variabilele acestui domeniu pot fi declarate, scrise și citite, fără niciun risc de efecte secundare pentru funcțiile din afara blocului în care sunt declarate.

Limbajele de programare care utilizează semantica de apel prin valoare furnizează un subrutin numit cu propria copie locală a argumentelor transmise acestuia. În majoritatea limbilor, acești parametri locali sunt tratați la fel ca alte variabile locale din subrutină. În schimb, apelul prin referință și apelul prin nume semantică permit parametrilor să acționeze ca aliasuri ale valorilor transmise ca argumente, permițând subrutinei să modifice variabile în afara propriului său domeniu.

Variabile locale statice

Un tip special de variabilă locală, numită locală statică, este disponibil în multe limbaje principale (inclusiv C / C ++ , Visual Basic și VB.NET ) care permite păstrarea unei valori de la un apel al funcției la altul - este o variabilă statică cu scop local. În acest caz, apelurile recursive către funcție au, de asemenea, acces la variabila (unică, alocată static ). În toate limbile de mai sus, variabilele statice sunt declarate ca atare cu un cuvânt cheie special de clasă de stocare (de exemplu, static ).

Localnicii statici din funcțiile globale au aceeași durată de viață ca și variabilele globale statice , deoarece valoarea lor rămâne în memorie pe durata de viață a programului, dar au domeniul funcțional (nu domeniul global), ca și în cazul variabilelor locale automate.

Acest lucru este distinct de alte utilizări ale static cuvântului cheie , care are mai multe semnificații diferite în diferite limbi.

Variabile locale în Perl

Perl acceptă atât variabile locale dinamice, cât și cu scop lexical. Cuvântul cheie local este utilizat pentru a defini variabilele cu scop dinamic local, în timp ce my este utilizat pentru variabilele cu scop lexical local. Deoarece domeniul de aplicare dinamic este mai puțin obișnuit astăzi, documentația Perl avertizează că „ local nu este ceea ce majoritatea oamenilor consideră„ local ”.”. În schimb, local cuvântul cheie oferă o valoare temporară, cu un scop dinamic unei variabile globale (pachet), care durează până la sfârșitul blocului de închidere. Cu toate acestea, variabila este vizibilă pentru orice funcție apelată din interiorul blocului. Pentru a crea variabile locale cu scop lexical, utilizați în my schimb operatorul.

Pentru a înțelege cum funcționează, luați în considerare următorul cod:

$a = 1;
sub f() {
    local $a;
    $a = 2;
    g();
}
sub g() {
    print "$a\n";
}
g();
f();
g();

aceasta va genera:

1
2
1

Acest lucru se întâmplă deoarece variabila globală $ a este modificată într-o nouă semnificație temporară (locală) în interior f() , dar valoarea globală este restabilită la ieșirea din domeniul de aplicare al f() .

Folosirea my în acest caz în loc de local ar fi imprimat 1 de trei ori, întrucât în ​​acest caz $a variabila ar fi limitată la sfera statică a funcției f() și nu ar fi văzută de g() .
Randal L. Schwartz și Tom Phoenix susțin că operatorul local ar fi trebuit să aibă un nume diferit save .

Variabile locale în Ruby

Ruby ca limbă a fost inspirat și de Perl, dar în acest caz, notația a fost simplificată: un nume de variabilă globală trebuie să fie precedat de un semn $, cum ar fi $variable_name , în timp ce o variabilă locală pur și simplu nu are un semn $ în fața numelui său, ca variable_name (în timp ce în perl toate valorile scalare au un $ în față). Rețineți că Ruby oferă suport încorporat numai pentru variabilele locale cu scop static, cum ar fi Perl my , nu variabile locale cu scop dinamic, cum ar fi Perl local . Există cel puțin o bibliotecă pentru Ruby care oferă variabile cu scop dinamic.

Vezi si

Referințe

  1. ^ "Standard C actual" (PDF) .   (3,61 MB) (începând cu 2009). În special, a se vedea secțiunea 6.2.4 „Durata stocării obiectelor”, pagina 32.
  2. ^ perldoc.perl.org: local
  3. ^ perldoc.perl.org: perlsub: Valori temporare prin local()
  4. ^ perldoc.perl.org: perlsub: Variabile private prin my()
  5. ^ Randal L. Schwartz și Tom Phoenix (01-07 2001). Learning Perl ediția a 3-a . O'REILLY. paragraful 4.7. ISBN   0-596-00132-0 .
  6. ^ Conrad Irwin. "LSpace: Domeniu dinamic pentru Ruby". Decembrie 2012 http://cirw.in/blog/lspace Adus 16-10-2013.