Upvalues partagées entre fermetures
Découvrez le partage d’une même upvalue entre plusieurs fermetures et les effets de sa modification.
Upvalues partagées entre fermetures est une leçon Lua Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Lua Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Lua Academy comprend 4 leçons au total.
Partager la même variable capturée
Deux fermetures définies dans la même portée peuvent partager exactement la même cellule de variable capturée. Les modifications effectuées par l’une sont visibles par l’autre.
local function makeGetterSetter()
local value = 0
local function get() return value end
local function set(v) value = v end
return get, set
end
local get, set = makeGetterSetter()
set(42)
print(get()) -- 42Pourquoi le partage se produit
Lua ne copie pas les variables capturées pour chaque fermeture. Toutes les fermetures créées dans le même bloc et pointant vers la même variable locale partagent une seule cellule de variable capturée.
Modèle observateur via une variable capturée partagée
Une variable capturée partagée peut servir de bus de messages entre plusieurs fermetures.
local count = 0
local inc = function() count = count + 1 end
local dec = function() count = count - 1 end
local get = function() return count end
inc(); inc(); dec()
print(get()) -- 1Piège lié à la variable de boucle
Dans une boucle numeric for, chaque itération crée une nouvelle variable locale de boucle ; les fermetures capturent donc des variables capturées indépendantes.
local fns = {}
for i = 1, 3 do
fns[i] = function() return i end
end
print(fns[1](), fns[2](), fns[3]()) -- 1 2 3 (each closure has its own i)Piège lié à la variable d’une boucle while
Dans une boucle while, si vous capturez une seule variable qui change, toutes les fermetures partagent la même variable capturée et voient la valeur finale.
local fns = {}
local i = 0
while i < 3 do
i = i + 1
fns[i] = function() return i end -- all share same i!
end
print(fns[1]()) -- 3 (not 1!)Capturer une nouvelle variable locale
Pour capturer des valeurs indépendantes dans une boucle while, introduisez une nouvelle variable locale dans le corps de la boucle.
local fns = {}
local i = 0
while i < 3 do
i = i + 1
local ci = i -- new local per iteration
fns[i] = function() return ci end
end
print(fns[1]()) -- 1, fns[2]() == 2Modèle de module à état partagé
Un module peut exposer plusieurs fonctions qui partagent une table d’état privée au moyen de variables capturées.
local function makeStack()
local data = {}
return {
push = function(v) data[#data+1] = v end,
pop = function() local v = data[#data]; data[#data]=nil; return v end,
size = function() return #data end,
}
endAlias et modification
Soyez prudent : toutes les fermetures qui référencent la même variable capturée voient immédiatement la même modification. C’est puissant, mais cela peut créer un couplage involontaire.
Identité d’une variable capturée
debug.upvalueid(f, n) renvoie l’identité unique de la nᵉ variable capturée de la fonction f. Deux fermetures ayant le même ID de variable capturée partagent la même cellule.
debug.upvaluejoin
debug.upvaluejoin(f1, n1, f2, n2) fait en sorte que la nᵉ variable capturée de f1 partage la même cellule que la nᵉ variable capturée de f2. C’est un outil de bas niveau pour le débogage.
Modèles pratiques
- Paires getter/setter partageant une variable privée.
- Compteur d’événements avec réinitialisation exposée par plusieurs fermetures.
- État d’un module partagé par plusieurs fonctions d’API.
Question sur une variable capturée partagée
Deux fermetures get et set sont créées dans la même portée et capturent toutes deux value. Si set(99) est appelée, que renvoie get() ?
Récapitulatif : variables capturées partagées
Les fermetures d’une même portée partagent des cellules de variables capturées. Les modifications sont immédiatement visibles par toutes les fermetures qui les partagent. C’est le fondement de l’encapsulation et de l’état des modules en Lua.
Questions Fréquemment Posées
La leçon « Upvalues partagées entre fermetures » est-elle gratuite ?
Oui — le texte complet de « Upvalues partagées entre fermetures » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Lua Academy, passe à CoddyKit PRO. Le cours Lua Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Upvalues partagées entre fermetures » ?
Découvrez le partage d’une même upvalue entre plusieurs fermetures et les effets de sa modification. Tu pratiques Lua Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Lua Academy ?
Aucune expérience préalable n'est requise. Lua Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Upvalues partagées entre fermetures » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Lua Academy ?
Oui. Chaque leçon Lua Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Que sont les upvalues ?
- Upvalues partagées entre fermetures
- Fonctions fabrique et générateurs
- Mémorisation avec des fermetures