sfere de vizibilitate, cum ar fi camere într-o casă
când am vorbit despre variabile am menționat că cel mai frecvent tip devariabile este „variabila locală”, fără a explica mai departe de ce suntlocale. Local pentru ce? Unde? În sfârșit suntem gata să explicăm asta mai mult.
deoarece am vorbit acum despre metode, putem discuta și un alt concept important: domenii.
Wikipedia spune: „în programare, scopul unui nume este partea unui programunde numele este valid: unde numele poate fi folosit pentru a se referi la ceva.”(ușor modificat pentru a se potrivi cu propria noastră terminologie)
numele sunt cunoscute (sau definite) într-un anumit domeniu și necunoscute (sau nedefinite)în afara acestui domeniu.
vă puteți gândi la un domeniu de aplicare ca la o sferă, un balon sau o cameră (cu nowindows și ușile închise): anumite nume, cum ar fi numele variabilelor, sunt „cunoscute” și”vizibile” în interiorul camerei. Alte nume, cunoscute și vizibile într-o altă cameră suntnu sunt cunoscute în această cameră, ci numai în cealaltă cameră.
de fiecare dată când există un apel de metodă, iar fluxul de execuție intră în corpul metodei, acesta intră într-un nou domeniu sau „cameră”. Lucrurile care sunt” locale „în domeniul de aplicare al acestei metode (adică lucrurile care sunt” în interiorul ” camerei), sunt vizibile numai în acest domeniu. În afara ei, ele sunt necunoscute.
variabilă locală nedefinită sau metodă
aceasta este, de asemenea, o bună ocazie de a vorbi despre un mesaj de eroare pe care îl puteți vedea cel mai des. De exemplu, îl veți vedea de fiecare dată când ați făcut o greșeală de scriere și ați scris greșit o variabilă sau un nume de metodă.
luați în considerare acest cod:
def add_two(number) number + 2endputs add_two(3)puts number
liniaputs add_two(2)
va emite5
, dar liniaputs number
va ridica o eroare.
Acest lucru se datorează faptului că variabilanumber
care este atribuit numărul3
când wecall metoda este o variabilă locală. Este local pentru domeniul de aplicare al metodei. Iteste creat atunci când fluxul de execuție intră în metodă.
în afara acestui domeniu de aplicare, când fluxul de execuție a revenit din metodădomeniul metodei a fost distrus și toate variabilele locale au dispărut. Prin urmare, variabila locală number
nu este cunoscută, iar Ruby ridică o eroare spunândundefined local variable or method 'number'
.
dacă te gândești la acest mesaj de eroare pentru puțin, are sens pentru tine?
am omis în tăcere faptul că, în Ruby, atât numele de variabile locale, cât și numele metodelor, sunt scrise în același mod: sunt doar cuvinte simple.De exemplu, aici:
number = 2puts number
number
este o variabilă locală și este utilizată în liniaputs number
.
cu toate acestea, aici:
def number 2endputs number
number
este numele unei metode. Și poate fi folosit (numit) în același mod: puts number
Acest lucru se datorează faptului că Ruby, atunci când execută un program, evaluează o declarație dupăaltul. Și când întâlnește un cuvânt simplu canumber
atunci va verifica mai întâi dacă, în domeniul actual, cunoaște o variabilă locală cu același nume. Dacă da, va folosi valoarea asociată acestei variabile. Dacănu există o variabilă locală cu acest nume, atunci va căuta o metodă. Dacă nu există nici o metodă cu acest nume, atunci va ridica mesajul de eroareundefined local variable or method 'number'
.
deci mesajul de eroare este destul de precis, dar, de asemenea, sună un fel de complicat. Whatit practic încearcă să spun este:
ați folosit cuvântul „număr” aici, și eu nu știu (în acest domeniu). Ai vrut să folosești o variabilă locală? Sau o metodă?
are sens ?
înapoi la subiectul domeniilor locale. Să ne uităm la un alt exemplu:
number = 1def add_to(number) number + 2endputs add_to(3)
care credeți că va fi ieșirea? Va fi3
sau5
? Altceva?
Dacă executați codul veți vedea că este 5
.
motivul pentru aceasta este că atribuim numărul 1
în domeniul exterior la avariabil number
, dar această variabilă nu este folosită niciodată: singura altă linie din domeniul exterior este ultima linie puts add_to(3)
, iar această linie nu utilizează variabila
number
.
în schimb, când fluxul de control intră în metodaadd_to
Ruby va crea un nou domeniu local și va defini o nouă variabilă localănumber
care este atribuit numărul3
care a fost trecut la metodă. Această nouă variabilănumber
este locală domeniului metodei și, prin urmare, aceasta este diferită de cea de pe prima linie, în domeniul exterior.
am găsit următoarele o metaforă bună pentru scopuri:
când Ruby intră într-o metodă, este ca și cum ar intra într-o cameră nouă strălucitoare într-o casă. Cu ea, ea aduce obiectele care sunt transmise ca argumentemetoda de apel. În exemplul de mai sus, ea aduce un obiect care este numărul 3
.
acum, de îndată ce Ruby intră în metodă, ea lipeste note post-it peobiecte, conform listei de argumente din definiția metodei. În exemplul nostru, acesta este numele number
. Deci, de acum înainte, în această cameră, există o variabilă locală cunoscută care are o valoare atribuită: obiectul (numărul) 3
cu nota post-it number
pe ea.
în exemplul nostru, domeniul de aplicare exterior și domeniul de aplicare al metodeiadd_two
, aredouă camere diferite și există două note post-it diferite lipite pe două numere diferite, care se întâmplă să aibă același nume pe ele.