Am văzut până acum că trebuie să declarăm variabilele înainte să le folosim. Dar, oare le putem folosi oriunde? Nu chiar...
Să considerăm următorul program:
1 2 3 4 5 6 7 8 9 10 11 |
func test () { var n = 2457 if (n % 2 == 0) { println("Număr par") } else { println("Număr impar") } } test() println(n) |
Poate ne-am aștepta ca totul să fie în regulă, dar nu e așa. Primim o eroare care ne spune că variabila n din linia 11 nu este cunoscută. Ar părea că am declarat această variabilă în linia 2. Dar, această declarație a fost făcută în interiorul funcției test și e valabilă doar acolo.
Spunem că o variabilă este vizibilă doar acolo unde este declarată. Evident, ea poate fi folosită doar acolo unde este vizibilă. Spunem că locul în care poate fi văzută o variabilă este domeniul de vizibilitate al variabilei.
Am văzut că o variabilă declarată într-o funcție nu poate fi utilizată în afara funcției respective. Dar, e mai complicat decât atât. De fapt, o variabilă este vizibilă doar în interiorul blocului de instrucțiuni în care a fost declarată. Următorul program nu este nici el corect:
1 2 3 4 5 6 |
var n = 2457 if (n % 2 == 0) { var k = 47 println(k % 10) } println(k) |
De data aceasta eroarea apare în linia 6, deși variabila k a fost declarată în linia 3.
Dacă o variabilă nu este vizibilă într-un anumit bloc de instrucțiuni, o putem declara. Ar putea părea că am declarat o variabilă de mai multe ori, dar trebuie să luăm în considerare faptul că domeniile de vizibilitate sunt diferite. Următorul program este corect:
1 2 3 4 5 6 7 8 |
var n = 2457 if (n % 2 == 0) { var k = 47 println(k % 10) } else { var k = 13 println(k % 2) } |
Practic avem două variabile k; prima există în blocul de instrucțiuni dintre liniile 2 și 5, iar a doua în blocul dintre liniile 5 și 8.
Trebuie să avem grijă ca domeniile de vizibilitate a două variabile cu același nume să nu se suprapună. De cele mai multe ori nu este permis; uneori este posibil, dar trebuie să fim atenți.
Am putea încerca să înlocuim în linia 1 n cu k. Este în continuare corect; în liniile 5 și 8 variabila k este practic redefinită.
Să vedem un exemplu asemănător:
1 2 3 4 5 6 |
func test(n: Int) { var n = 47 println(n) } test(2457) |
Este permis și acest lucru; parametrul n este vizibil în cadrul funcției test, dar corpul acestei funcții conține o declarație a unei variabile cu același nume și acesta este utilizată în continuare. De fapt, am putea avea următoarea situație:
1 2 3 4 5 6 7 |
func test(n: Int) { println(n) var n = 47 println(n) } test(2457) |
În urma execuției instrucțiunii din linia 2 se va afișa valoarea 47, iar în urma execuției instrucțiunii din linia 4 se va afișa valoarea 2457.
Am văzut că două variabile sunt diferite chiar dacă au aceeași denumire. Să vedem mai exact ce înseamnă acest lucru:
1 2 3 4 5 6 7 8 9 |
func test(n: Int) { var n: Int n = 47 println(n) } var n = 2457 test(2457) println(n) |
Avem o variabilă n a cărei valoare este 2457. Apelăm funcția test; în cadrul acesteia avem o altă variabilă n cu valoarea 47 și scriem valoarea acesteia. Execuția funcției se încheia și urmează scrierea variabilei n; se va scrie 2457, fiindcă variabila din interiorul funcției nu este vizibilă în afara funcției și atribuirea din linia 3 afectează doar variabila declarată în linia 2, nu și pe cea declarată în linia 7.
Trebuie să reținem faptul că orice instrucțiune care folosește o variabilă o folosește pe cea vizibilă, chiar dacă în alte locuri există variabile cu același nume.
Va urma
Am văzut până acum cum putem avea instrucțiuni care să se execute sau nu (folosind instrucțiuni condiționale). Am văzut de asemenea cum putea avea instrucțiuni care sunt executate de mai multe ori (folosind apeluri multiple de funcții). Dar, trebuie să efectuăm câte un apel de fiecare dată când doream să executăm o funcție. În următorul episod vom introduce conceptul de buclă; vedea cum vom putea executa anumite instrucțiuni de mai multe ori, atâta timp cât o anumită condiție este îndeplinită.