La portée des variables

Par défaut, en Lua, les variables sont globales, contrairement à la plupart des autres langages où elles sont locales par défaut :

1
2
3
4
5
6
7
8
9
function porte()
  a = 5
end

porte()
print(a)

-- output :
--  5

Si l’on souhaite qu’une variable n’existe que dans le bloc où elle est définie, il faut utiliser le mot-clé local :

1
2
3
4
5
6
7
8
9
function porte()
  local a = 5
end

porte()
print(a)

-- output :
--  nil

Je vous recommande vivement d’utiliser la forme locale. Même si elle peut sembler moins pratique, elle vous évitera de nombreux problèmes à long terme.

Variables locales dans les fonctions

Les paramètres passés à une fonction sont automatiquement locaux, tout comme les variables déclarées avec local :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
function plus(a, b)
  local val = a + b
  return val
end

resp = plus(6, 6)

print(resp)
print(a)
print(b)

-- output :
--  12
--  nil
--  nil

Il est très fortement conseillé de privilégier les variables locales autant que possible.

Exemple d’un comportement à éviter

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
a = 5
print(a)

function maFunc()
  a = 6
  print(a)
end

maFunc()
print(a)

-- output :
--  5
--  6
--  6

Dans cet exemple, la variable a = 5 a été écrasée dans la fonction maFunc() par a = 6, car elle n’était pas déclarée locale. Sur un petit script, ce genre d’erreur peut être repérée facilement. Mais dès que votre programme dépassera 500 ou 600 lignes — surtout en collaboration — ce type de bug peut devenir très difficile à traquer.

Utiliser local permet d’éviter ce genre de conflits et rend votre code plus clair, modulaire et sûr.