Lua Academy · leksjon

Delte upvalues mellom closures

Lær hvordan flere closures deler samme upvalue, og hvilke følger endringer får.

Leksjon 2 av 413 trinn

Delte upvalues mellom closures er en gratis leksjon i Lua Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Lua Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Lua Academy inneholder totalt 4 leksjoner.

Dele samme upvalue

To lukkinger som er definert i samme scope, kan dele nøyaktig samme upvalue-celle. Endringer gjort av den ene blir synlige for den andre.

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 skjer

Lua kopierer ikke upvalues for hver lukking. Alle lukkinger som opprettes i samme blokk og peker på den samme lokale variabelen, deler én upvalue-celle.

Observer-mønster via delt upvalue

En delt upvalue kan fungere som en meldingsbuss mellom flere lukkinger.

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

Fallgruve med løkkevariabler

I en numeric for-løkke opprettes en ny lokal løkkevariabel for hver iterasjon, slik at lukkinger henter inn uavhengige 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)

Fallgruve med while-løkkevariabler

I en while-løkke deler alle lukkinger den samme upvalien og ser sluttverdien hvis De lukker over én variabel som endres.

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!)

Hente inn en ny lokal variabel

For å hente inn uavhengige verdier i en while-løkke oppretter De en ny lokal variabel inne i løkkekroppen.

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

En modul kan eksponere flere funksjoner som deler en privat tilstandstabell gjennom 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 mutering

Vær forsiktig: Alle lukkinger som refererer til den samme upvalien, ser den samme endringen umiddelbart. Dette er kraftig, men kan føre til utilsiktet kobling.

Upvalue-identitet

debug.upvalueid(f, n) returnerer den unike identiteten til funksjonen fs n-te upvalue. To lukkinger med samme upvalue-ID deler den samme cellen.

debug.upvaluejoin

debug.upvaluejoin(f1, n1, f2, n2) gjør at den n-te upvalien i f1 deler samme celle som den n2-te upvalien i f2. Dette er et verktøy på lavt nivå for feilsøking.

Praktiske mønstre

  • Getter/setter-par som deler en privat variabel.
  • Hendelsesteller med nullstilling eksponert via flere lukkinger.
  • Modultilstand som deles av flere API-funksjoner.

Spørsmål om delt upvalue

To lukkinger, get og set, opprettes i samme scope, og begge henter inn value. Hvis set(99) kalles, hva returnerer get()?

Oppsummering: Delte upvalues

Lukkinger i samme scope deler upvalue-celler. Endringer blir umiddelbart synlige for alle lukkinger som deler cellen. Dette er grunnlaget for innkapsling og modultilstand i Lua.

Gratis å komme i gang

Lær deg Lua med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
40
Leksjoner
159

Ofte stilte spørsmål

Er leksjonen «Delte upvalues mellom closures» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Lua Academy, inkludert «Delte upvalues mellom closures», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Lua Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Delte upvalues mellom closures»?

Lær hvordan flere closures deler samme upvalue, og hvilke følger endringer får. Du øver på Lua Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Lua Academy?

Ingen tidligere erfaring er nødvendig. Lua Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.

Hvor lang tid tar leksjonen «Delte upvalues mellom closures»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Lua Academy-leksjonen?

Ja. Alle Lua Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Hva er upvalues?
  2. Delte upvalues mellom closures
  3. Fabrikkfunksjoner og generatorer
  4. Memoisering med closures
← Tilbake til Lua Academy