La porté des variables

Par défaut, les variables sont globales alors que dans tous les autres langages de programmation elles sont locales :

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

porte()
print(a)

-- output:
--  5

Si l’on souhaite qu’elle soit locale, c’est à dire qu’elle n’existe qu’au niveau du bloc, il faut utiliser le mot clef local :

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

porte()
print(a)

-- output:
--  nil

Je vous invite fortement à utiliser cette dernière forme. Même si elle semble moins pratique, elle vous évitera bien des ennuis à l’usage.

Les variables utilisées en paramètres des fonctions sont locales :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
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 recommandé d’utiliser des variables locales. Un exemple de comportement problématique :

 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

Ici a=5 a été écrasé dans la fonction maFunc() par a=6. Dans un petit programme, ce genre d’erreurs se voit assez rapidement mais dès que votre programme va atteindre 500 ou 600 lignes, le debuggage risque d’être plus compliqué à débusquer surtout si vous travaillez à plusieurs sur le même code.