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 12 |
object Test extends App { def test(): Unit = { 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 3. 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 7 8 |
object Test extends App { var n = 2457 if (n % 2 != 0) { var k = 47 println(k % 10) } println(k) } |
De data aceasta eroarea apare în linia 7, deși variabila k a fost declarată în linia 4.
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 9 10 |
object Test extends App { 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 3 și 6, iar a doua în blocul dintre liniile 6 și 9.
Trebuie să avem grijă ca domeniile de vizibilitate a două variabile cu același nume să nu se suprapună. Scala ne permite acest lucru.
Am putea încerca să înlocuim în linia 2 n cu k.
1 2 3 4 5 6 7 8 9 10 |
object Test extends App { var k = 2457 if (k % 2 != 0) { var k = 47 println(k % 10) } else { var k = 13 println(k % 2) } } |
Programul va funcționa, în blocurile de instrucțiuni are definesc o variabilă k cu același nume cu cea de la linia 2, nu vom mai putea accesa valoarea acesteia din urmă. Practic la linia 4 variabila de la linia 2 devine invizibilă pentru blocul de instrucțiuni.
Să vedem acum un alt exemplu interesant:
1 2 3 4 5 6 7 8 |
object Test extends App { def test(n: Int) = { var n = 47 println(n) } test(2457) } |
Corpul unei funcții poate conține o declarație a unei variabile cu același nume cu al unui parametru. Deci, parametrul n este devine invizibil în cadrul funcției test.
Am văzut că, dacă au domenii de vizibilitate diferite, 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 10 |
object Test extends App { def test() = { var n = 47 println(n) } var n = 2457 test() println(n) } |
Pe linia 7 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 3, 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ă.