Delte upvalues mellem closures
Forstå, hvordan flere closures deler den samme upvalue, og hvilke konsekvenser ændringer har.
Delte upvalues mellem closures er en gratis Lua Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Lua Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Lua Academy-kurset indeholder 4 lektioner i alt.
Deling af den samme upvalue
To closures, der er defineret i det samme omfang, kan dele præcis den samme upvalue-celle. Ændringer foretaget af den ene kan ses af den anden.
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()) -- 42Hvorfor deling sker
Lua kopierer ikke upvalues for hver closure. Alle closures, der oprettes i den samme blok og peger på den samme lokale variabel, deler én upvalue-celle.
Observatørmønster via delt upvalue
En delt upvalue kan fungere som en meddelelsesbus mellem flere closures.
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()) -- 1Faldgrube ved løkkevariabler
I en numeric for-løkke opretter hver gennemløb en ny lokal løkkevariabel, så closures indfanger uafhængige upvalues.
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)Faldgrube ved while-løkkevariabler
I en while-løkke deler alle closures den samme upvalue og ser den endelige værdi, hvis du lukker over én variabel, der ændres.
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!)Indfangning af en ny lokal variabel
Hvis du vil indfange uafhængige værdier i en while-løkke, skal du introducere en ny lokal variabel i løkkens krop.
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]() == 2Modulmønster med delt tilstand
Et modul kan eksponere flere funktioner, der deler en privat tilstandstabel via upvalues.
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,
}
endAliasing og mutation
Vær forsigtig: Alle closures, der refererer til den samme upvalue, ser den samme ændring med det samme. Det er effektivt, men kan skabe utilsigtet kobling.
Upvalue-identitet
debug.upvalueid(f, n) returnerer den unikke identitet for funktionens f n'te upvalue. To closures med samme upvalue-id deler den samme celle.
debug.upvaluejoin
debug.upvaluejoin(f1, n1, f2, n2) får den n'te upvalue i f1 til at dele celle med den n'te upvalue i f2. Et værktøj på lavt niveau til fejlfinding.
Praktiske mønstre
- Getter/setter-par, der deler en privat variabel.
- Hændelsestæller med nulstilling eksponeret via flere closures.
- Modultilstand, der deles på tværs af flere API-funktioner.
Spørgsmål om delte upvalues
To closures get og set oprettes i det samme omfang, og begge indfanger value. Hvad returnerer get(), hvis der kaldes set(99)?
Opsummering: Delte upvalues
Closures i det samme omfang deler upvalue-celler. Ændringer er straks synlige for alle closures, der deler dem. Dette er grundlaget for indkapsling og modultilstand i Lua.
Lær Lua med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 40
- Lektioner
- 159
Ofte stillede spørgsmål
Er lektionen “Delte upvalues mellem closures” gratis?
Ja — alle 3 lektioner i læringssporet Lua Academy, inklusive “Delte upvalues mellem closures”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Lua Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Delte upvalues mellem closures”?
Forstå, hvordan flere closures deler den samme upvalue, og hvilke konsekvenser ændringer har. Du øver dig i Lua Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Lua Academy?
Der kræves ingen tidligere erfaring. Lua Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “Delte upvalues mellem closures”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Lua Academy-lektion?
Ja. Alle Lua Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Hvad er upvalues?
- Delte upvalues mellem closures
- Factory-funktioner og generatorer
- Memoisering med closures