Qu’est-ce qu’une fermeture ?
Fait partie de la section Logique et flux 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 comme arguments et renvoyées par d'autres fonctions. Nous allons maintenant explorer l'une des conséquences les plus puissantes de cela : les clôtures.
Une fermeture se produit lorsqu’une fonction imbriquée « se souvient » des variables locales de la fonction qui l’englobe, même après que cette fonction externe a fini de s’exécuter. Cela peut sembler étrange au début : comment une variable peut-elle encore exister après que la fonction qui l’a créée a terminé son exécution ?
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()) -- 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. Normalement, vous vous attendriez à ce que count disparaisse une fois que createCounter() a terminé. Mais la fonction renvoyée a toujours accès à count. Elle « capture » cette variable.
Chaque fois que vous appelez counter(), cette fonction accède à la même variable count, créée lors de la première exécution de createCounter(), et la modifie. La fonction interne emporte son environnement avec elle, préservant ainsi 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, en mémorisant la valeur de
factor - Appelez la fonction multiplicatrice avec le paramètre
numberet renvoyez le résultat
Paramètres :
factor(nombre) : la valeur du multiplicateurnumber(nombre) : le nombre à multiplier
Renvoie :
- Le résultat de la multiplication de
numberparfactor(nombre)
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 Logique et flux
1Itération avancée des tables
Itérer avec pairs()Itérer avec ipairs()pairs() contre ipairs()Récapitulatif - Fiche de personnage2Fonctions supplémentaires de la bibliothèque table
table.concat()construction de tables et unpack()table.sort()Tri personnalisé avec des fonctionsRécapitulatif - Tableau des meilleurs scores3Concepts avancés des fonctions
Retourner plusieurs valeursFonctions variadiques (...)Les fonctions comme valeurs de première classeFonctions anonymesQu’est-ce qu’une fermeture ?Récapitulatif - Gestionnaire d’événements simpleEntraînez-vous par vous-même : Compilateur Lua en ligne