Les fermetures (closures)

Lua prend en charge les fonctions anonymes. Elles permettent notamment de former des fermertures (closures). Les fonctions anonymes sont utiles lorsque l’on souhaite définir une fonction sans avoir à la nommer.

 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 renvoie une autre fonction que nous définissons anonymement dans le corps de intSeq. La fonction retournée se ferme sur la variable i pour former une fermeture. Nous appelons intSeq en attribuant le résultat (une fonction) à nextInt. Cette valeur de fonction capture sa propre valeur de i qui sera mise à jour chaque fois que nous appelons nextInt

Pour confirmer que l’état est unique à cette fonction particulière, regardez l’exemple suivant :

 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