LoriotPro Extended Edition Programmation en language LUA

Table des matières

HelpLUA

Portées des variables en LUA

Définition

Portée globale

Le mot-clé local

Portée locale

Portées des variables, définition

Les programmes sont morcelés en unités de code, comme pour les fonctions et les modules.

Dans ces unités nous pouvons créer des variables et leur affecter des valeurs de sorte que nous puissions traiter des données et faire que le programme exécute une tâche donnée. Pour un certain nombre de raisons (conflits de noms, information cahée, etc...) nous pouvons vouloir isoler des variables dans les unités. Nous pouvons également vouloir créer des variables provisoires pour une tâche qui peuvent être supprimées une fois celle-ci terminée.

Le terme "unité" est peu un vague. Nous employons le terme portée des variables pour décrire le jeu de code dans lequel un ensemble de variables sont disponible.

Les variables auxquels nous avons accès sont dites visibles. La portée d'une variable est le bloc contenant le code dans lequel elle est visible. Les portées sont créées et détruites pendant que le programme exécute ces blocs de code. Les variables contenues dans ces blocs sont créées et détruites selon les règles décrites ci-après. Quand nous écrivons un bloc et une nouvelle portée nous écrivons une portée locale. Les portées externes sont visibles des portées locale mais pas le contraire.

Dans Lua des blocs de code peuvent être définis en utilisant des fonctions et les mots-clés do...end par exemple,

> function foo() local x=1 end
> foo()
> do local y=1 end

L'exemple ci-dessus définit juste une fonction appelée foo qui contient une portée. Nous créons la variable x dans la portée locale de la fonction. Quand nous sortons de la fonction, la portée est finie, la variable x est supprimée et n'est plus visible. Le bloc do...end contient la fonctionnalité semblable.

Portée globale

Les variables qui ne sont pas dans un bloc défini sont de portée globale. Tout ce qui est en portée globale est accessible par toutes les portées locales.

> g = "global"
> print(g)
global
> function foo() print(g) end
> foo()
global

Dans l'exemple ci-dessus g est dans la portée globale, c.-à-d. aucun bloc enfermant n'est défini. La fonction foo est également dans la portée globale. Nous écrivons foo la portée de fonction quand foo() s'appelle. Nous pouvons imprimer la valeur de g parce que nous pouvons voir la portée externe de la portée foo intérieure.

Le mot-clé local

Nous employons le mot-clé local pour définir toutes les variables qui nous voulons garder locales au bloc de code dans lequel elles sont définis.

Note: Toutes les variables déclarées dans Lua sont de portée globale à moins qu'elles n'aient été déclarées en locales. Ceci peut ne pas être le comportement auquel vous êtes habitué. Par exemple dans C et beaucoup d'autres languages, les variables définies dans des portées locales restent dans cette portée.

> a = 1 -- global scope
> function foo() -- start of foo scope
>> b = 2 -- no local keyword so global scope
>> local c = 3 -- local scope
>> end -- end of foo scope
> print(a,b,c) -- before we call foo
1 nil nil
> foo()
> print(a,b,c) -- after foo called
1 2 nil

Portée locale

Quand nous créons un bloc nous créons une portée dans laquelle les variables peuvent vivre par exemple.

> do local seven = 7 print(seven) end
7
> print(seven)
nil

Dans l'exemple ci-dessus le bloc do et end enferme la déclaration de la variable locale seven. Vous constatez que nous pouvons afficher sa valeur, 7. Quand nous sortons de la portée au mot-clé end nous perdons la visibilité des variables locales dans cette portée. Quand nous affcihons la valeur seven une fois en dehors de la portée nous obtenons nil. Ceci signifie "variable non trouvée". Le mot-clé local est placé avant variable que nous voulons laisser visible seulement dans cette portée.

Dans l'exemple suivant x commence par la valeur 1. Nous créons un bloc avec les mots-clés do et end. Nous employons le mot-clé local pour indiquer que nous voulons une nouvelle variable également appelée x, qui est seulement visible dans ce bloc ou portée.

> x = 1
> print(x)
1
> do
>> local x
>> x = 2
>> print(x)
>> end
2
> print(x)
1

Vous pouvez voir qu'une fois que la portée do...end est fini, la deuxième affectation de x disparaît et nous retournons de nouveau à la précédente affectation.

mot clé local dans la portée globale

Le mot-clé local peut être employé dans toutes les portée, portées non simplement locales et de fonction. Ceci pourrait sembler unintuitive mais même la portée globale dans Lua peut devenir une portée local si elle est employée comme module.

En raison de l'exécution de Lua il est plus efficace d'employer des variables local dans la mesure du possible. La raison technique de ceci est que des variables locales sont mises en référence par l'intermédiaire d'un "assigned number", tandis que des variables globales sont stockées dans une table qui est consultée avec une clef (le nom de variable). Les consultations de Tableau sont très rapidet dans Lua, mais cependant pas aussi rapide que des consultations locales de registre.

Si le code suivant est compilé nous pouvons regarder comment Lua génère les instructions virtuelles de sortie.

g = "global"
local l = "local"
print(g,l)

La ligne de commande outil luac (compilateur de Lua) peut être employée pour compiler le code, qui donne :

main <a.lua:0> (8 instructions, 32 bytes at 00355578)
0 params, 4 stacks, 0 upvalues, 1 local, 4 constants, 0 functions
1 [2] LOADK 0 1 ; "global"
2 [2] SETGLOBAL 0 0 ; g
3 [4] LOADK 0 2 ; "local"
4 [6] GETGLOBAL 1 3 ; print
5 [6] GETGLOBAL 2 0 ; g
6 [6] MOVE 3 0 0
7 [6] CALL 1 3 1
8 [6] RETURN 0 1 0

Nous n'entrerons pas dans le détail de ce sujet mais vous pouvez voir que les variables g et l sont traité différemment, et que l'accès aux variable de portée locale est plus efficace.



LUTEUS www.loriotpro.com