Lua Academy · Lektion

Delte upvalues mellem closures

Forstå, hvordan flere closures deler den samme upvalue, og hvilke konsekvenser ændringer har.

Lektion 2 af 413 trin

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())  -- 42

Hvorfor 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())  -- 1

Faldgrube 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]() == 2

Modulmø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,
  }
end

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

Gratis at komme i gang

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

  1. Hvad er upvalues?
  2. Delte upvalues mellem closures
  3. Factory-funktioner og generatorer
  4. Memoisering med closures
← Tilbage til Lua Academy