Qu'est-ce qu'une closure ?
Fait partie de la section Logic & Flow du Journey Lua de Coddy — leçon 14 sur 54.
Vous avez appris que les fonctions peuvent être stockées dans des variables, passées en tant qu'arguments et renvoyées par d'autres fonctions. Nous allons maintenant explorer l'une des conséquences les plus puissantes de cela : les fermetures (closures).
Une fermeture (closure) se produit lorsqu'une fonction imbriquée « se souvient » des variables locales de sa fonction englobante, même après que cette fonction externe a fini de s'exécuter. Cela peut paraître étrange au début : comment une variable peut-elle encore exister une fois que la fonction qui l'a créée est terminée ?
Voici un exemple simple qui illustre ce concept :
function createCounter()
local count = 0
return function()
count = count + 1
return count
end
end
local counter = createCounter()
print(counter()) -- Résultat : 1
print(counter()) -- Résultat : 2
print(counter()) -- Résultat : 3Lorsque createCounter() est appelée, elle crée une variable locale count et renvoie une fonction anonyme. Normalement, on s'attendrait à ce que count disparaisse une fois que createCounter() est terminée. Mais la fonction renvoyée a toujours accès à count — elle « capture » cette variable.
Chaque fois que vous appelez counter(), elle accède à la même variable count qui a été créée lorsque createCounter() a été exécutée pour la première fois. La fonction interne transporte son environnement avec elle, préservant l'état entre les appels.
Défi
FacileÉcrivez une fonction createMultiplier qui crée une fonction multiplicatrice avec un facteur spécifique, puis l'utilise immédiatement pour multiplier un nombre donné.
Logique :
- Créez une fonction imbriquée à l'intérieur de
createMultiplierqui prend un paramètre numérique - La fonction imbriquée doit multiplier son paramètre par le
factorde la fonction externe - La fonction imbriquée formera une fermeture (closure), se souvenant de la valeur de
factor - Appelez la fonction multiplicatrice avec le paramètre
numberet retournez le résultat
Paramètres :
factor(nombre) : La valeur du multiplicateurnumber(nombre) : Le nombre à multiplier
Retourne :
- Le résultat de la multiplication de
numberparfactor(nombre)
Aide-mémoire
Une fermeture (closure) se produit lorsqu'une fonction imbriquée « se souvient » des variables locales de sa fonction englobante, même après que cette fonction externe a fini de s'exécuter.
La fonction interne transporte son environnement avec elle, préservant l'état entre les appels :
function createCounter()
local count = 0
return function()
count = count + 1
return count
end
end
local counter = createCounter()
print(counter()) -- Sortie : 1
print(counter()) -- Sortie : 2
print(counter()) -- Sortie : 3Lorsque createCounter() est appelée, elle crée une variable locale count et renvoie une fonction anonyme. La fonction renvoyée a toujours accès à count — elle « capture » cette variable, même après que la fonction externe a fini de s'exécuter.
Essayez vous-même
function createMultiplier(factor, number)
local multiply = function(x)
return x * factor
end
-- Utilisez la fonction multiply ci-dessous
endCette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logic & Flow
1Itération avancée des tables
Itérer avec pairs()Itérer avec ipairs()pairs() vs. ipairs()Récapitulatif - Fiche de personnage2Plus de fonctions de la bibliothèque table
table.concat()Construction de table & unpack()table.sort()Tri personnalisé avec des fonctionsRécapitulatif - Tableau des scores3Concepts avancés sur les fonctions
Retourner plusieurs valeursFonctions variadiques (...)Les fonctions comme valeurs de première classeFonctions anonymesQu'est-ce qu'une closure ?Récapitulatif - Gestionnaire d'événements simple