Lua est un langage à portée lexicale.
La portée d'une variable, commence juste après la première déclaration de la variable à l'intérieur d'un bloc et dure jusqu'à la fin de ce bloc.
Un bloc, est un ensemble d'instructions sur plusieurs lignes.
Une fonction, une boucle for, while, do ..etc constitue un bloc et toute déclaration d'une variable à l'intérieure d'un bloc, appartient à ce bloc.
x = 10 -- ceci est une variable globale do -- déclaration d'un nouveau bloc local x = x -- initialisation d'une nouvelle variable 'x', -- MAIS cette fois ci "local" en reprenant la -- première valeur de x global. (10) print("1: "..x) --> 10 x = x + 1 do -- déclaration d'un autre bloc à l'intérieure du premier local x = x + 1 -- encore une autre variable 'x'... -- mais locale au deuxième bloc print("2: "..x) --> 12 end print("3: "..x) --> 11 end print("4: "..x) --> 10
La variable x est maintenant sortie des deux blocs, les variables locales n'existent plus, elle retrouve donc sa première valeur: x = 10
Et il ne faut pas oublier que chaque exécution d'une déclaration qui redéfinit une local crée automatiquement une nouvelle variable locale.
a = {} -- déclaration d'une table 'a' local x = 20 -- déclaration d'une variable locale 'x' for i = 1, 10 do local y = 0 -- déclaration d'une nouvelle variable locale -- et interne à la boucle for... end a[i] = function() y = y + 1; return x + y end print("i = "..i.." (x + y) = "..x + y) end
Les tables et les fonctions seront expliquées plus loin.
Mais pour le moment, il faut comprendre que la boucle tourne 10 fois ( ce qui représentent, dix instances de la fonction anonyme ).
Chaque boucle, va utiliser une nouvelle variable 'y', tandis que toutes partagent le même 'x'.
La variable i prendra + 1 à chaque tour, normal, mais x + y sera toujours égal à 20 du fait que y redevient local à chaque tour et donc = 0
Il est très important de bien comprendre cette notion de portée lexicale et de bien saisir que chaque variable locale n'est définie et n'existe que dans le bloc qui la contient.