Que sont les upvalues ?
Comprenez comment les fermetures capturent des variables comme upvalues depuis les portées englobantes.
Que sont les upvalues ? est une leçon Lua Academy gratuite sur CoddyKit. Ceci est la leçon 1 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.
Récapitulatif sur les fermetures
Une fermeture est une fonction accompagnée de références vers des variables de sa portée englobante. Ces variables capturées sont appelées upvalues.
Exemple d'upvalue
La fonction interne capture count dans la portée de la fonction externe.
local function makeCounter()
local count = 0
return function()
count = count + 1
return count
end
end
local next = makeCounter()
print(next()) -- 1
print(next()) -- 2Les variables capturées sont vivantes
Les variables capturées ne sont pas des copies : ce sont des références vers la variable. La fermeture peut à la fois les lire et les modifier.
Plusieurs variables capturées
Une fermeture peut capturer plusieurs variables provenant de plusieurs portées englobantes.
local function adder(x)
return function(y) return x + y end
end
local add5 = adder(5)
print(add5(3)) -- 8Durée de vie d’une variable capturée
Les variables capturées restent en vie tant qu’une fermeture qui les référence est elle-même en vie. Elles ne sont récupérées par le ramasse-miettes que lorsque toutes les fermetures qui les référencent ont été récupérées.
debug.getupvalue
Vous pouvez examiner les variables capturées avec debug.getupvalue(fn, n), qui renvoie le nom et la valeur de la nᵉ variable capturée.
local x = 10
local function f() return x end
print(debug.getupvalue(f, 1)) -- x 10Variable capturée ou globale
Les variables capturées (variables locales capturées par des fermetures) sont plus rapides que les variables globales. La VM y accède directement par index, sans recherche dans une table.
Variable capturée fermée
Lorsque le bloc englobant se termine, la variable capturée est fermée : elle est déplacée de la pile vers le tas. La fermeture continue de partager cette cellule du tas.
Variables capturées ouvertes ou fermées
Ouverte : la variable capturée se trouve encore sur la pile (la fonction englobante est toujours en cours d’exécution). Fermée : la variable capturée a été déplacée vers le tas lorsque la portée englobante s’est terminée.
Cas d’utilisation pratique
Les variables capturées permettent naturellement d’implémenter un état privé dans les fermetures : une fonction de module peut conserver un état privé sans l’exposer globalement.
local id = 0
local function newId()
id = id + 1
return id
endLimite du nombre de variables capturées
Chaque fonction Lua peut référencer jusqu’à 255 variables capturées. En pratique, cette limite est rarement préoccupante.
Question sur les variables capturées
Qu’est-ce qu’une variable capturée ?
Récapitulatif : variables capturées
Les variables capturées sont les variables externes capturées par une fermeture. Elles persistent sur le tas après la fin de la portée englobante, sont partagées par référence et fournissent un état privé modifiable sans variables globales.
Questions Fréquemment Posées
La leçon « Que sont les upvalues ? » est-elle gratuite ?
Oui — le texte complet de « Que sont les upvalues ? » 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 « Que sont les upvalues ? » ?
Comprenez comment les fermetures capturent des variables comme upvalues depuis les portées englobantes. 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 1 sur 4.
Combien de temps prend la leçon « Que sont les upvalues ? » ?
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