Les fermetures (closures)

Lua prend en charge les fonctions anonymes, qui permettent notamment de créer des fermetures (closures). Une fonction anonyme est utile lorsqu’on souhaite définir une fonction sans lui donner de nom.

Voici un exemple :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
function intSeq()
  i = 0
  -- Début de la fonction anonyme
  return function()
    i = i + 1
    return i
  end
end

nextInt = intSeq()
print(nextInt())
print(nextInt())
print(nextInt())

-- output :
--  1
--  2
--  3

La fonction intSeq retourne une fonction anonyme définie à l’intérieur de son corps. Cette fonction retournée capture la variable i et forme ainsi une fermeture.
Chaque appel à nextInt() met à jour et utilise sa propre version de i, stockée dans la fermeture.

État indépendant pour chaque fermeture

Pour démontrer que chaque fermeture maintient son propre état, examinons cet exemple :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function intSeq()
  i = 0
  return function()
    i = i + 1
    return i
  end
end

nextInt = intSeq()
print(nextInt())
print(nextInt())
print(nextInt())
print()

newInts = intSeq()
print(newInts())

-- output :
--  1
--  2
--  3
--
--  1

Comme vous pouvez le voir, newInts redémarre à 1, car il s’agit d’une nouvelle fermeture indépendante. Cela permet de créer des générateurs ou des objets avec état très facilement en Lua.