Lua Academy · leksjon

Hva er upvalues?

Forstå hvordan closures fanger variabler som upvalues fra omsluttende scope.

Leksjon 1 av 413 trinn

Hva er upvalues? er en gratis leksjon i Lua Academy på CoddyKit. Dette er leksjon 1 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.

Oppsummering av closures

En closure er en funksjon som er pakket sammen med referanser til variabler fra det omsluttende virkeområdet. De innfangede variablene kalles upvalues.

Eksempel på upvalue

Den indre funksjonen fanger opp count fra virkeområdet til den ytre funksjonen.

local function makeCounter()
  local count = 0
  return function()
    count = count + 1
    return count
  end
end
local next = makeCounter()
print(next())  -- 1
print(next())  -- 2

Upvalues er levende variabler

Upvalues er ikke kopier – de er referanser til variabelen. Lukkingen kan både lese og skrive til dem.

Flere upvalues

En lukking kan hente inn flere variabler fra flere omsluttende scopes.

local function adder(x)
  return function(y) return x + y end
end
local add5 = adder(5)
print(add5(3))  -- 8

Levetid for upvalues

Upvalues lever så lenge minst én lukking som refererer til dem, lever. De samles av søppeloppsamleren først når alle lukkene som refererer til dem, er samlet inn.

debug.getupvalue

De kan inspiseres med debug.getupvalue(fn, n), som returnerer navnet og verdien til den n-te upvalien.

local x = 10
local function f() return x end
print(debug.getupvalue(f, 1))  -- x  10

Upvalue kontra global

Upvalues (lokale variabler som er hentet inn av lukkinger) er raskere enn globale variabler. VM-en får direkte tilgang til dem via en indeks, uten tabelloppslag.

Lukket upvalue

Når den omsluttende blokken avsluttes, blir upvalien lukket: den flyttes fra stakken til heapen. Lukkingen fortsetter å dele denne heap-cellen.

Åpne og lukkede upvalues

Åpen: upvalien ligger fortsatt på stakken (den omsluttende funksjonen kjører fortsatt). Lukket: upvalien er flyttet til heapen da det omsluttende scopet ble avsluttet.

Praktisk bruksområde

Upvalues gjør det naturlig å implementere privat tilstand i lukkinger – en modulfunksjon kan beholde privat tilstand uten å eksponere den globalt.

local id = 0
local function newId()
  id = id + 1
  return id
end

Grense for antall upvalues

Hver Lua-funksjon kan referere til opptil 255 upvalues. Dette er sjelden et praktisk problem.

Spørsmål om upvalues

Hva er en upvalue?

Oppsummering: Upvalues

Upvalues er de ytre variablene som lukkingen har hentet inn. De vedvarer på heapen etter at det omsluttende scopet avsluttes, deles via referanse og gir privat, muterbar tilstand uten globale variabler.

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 «Hva er upvalues?» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Lua Academy, inkludert «Hva er upvalues?», 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 «Hva er upvalues?»?

Forstå hvordan closures fanger variabler som upvalues fra omsluttende scope. 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 1 av 4.

Hvor lang tid tar leksjonen «Hva er upvalues?»?

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