Menu
Coddy logo textTech

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 : 3

Lorsque 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.

challenge icon

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 createMultiplier qui prend un paramètre numérique
  • La fonction imbriquée doit multiplier son paramètre par le factor de 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 number et retournez le résultat

Paramètres :

  • factor (nombre) : La valeur du multiplicateur
  • number (nombre) : Le nombre à multiplier

Retourne :

  • Le résultat de la multiplication de number par factor (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 : 3

Lorsque 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

end
quiz iconTestez-vous

Cette 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