Funktioner som værdier
Gem og videregiv funktioner.
Funktioner som værdier er en gratis Lua Academy-lektion på CoddyKit. Dette er lektion 1 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.
Funktioner er førsteklasses værdier
I Lua er funktioner førsteklasses værdier. Det betyder, at en funktion bare er data: du kan gemme den i en variabel, sende den til en anden funktion, returnere den og gemme den i en tabel.
Denne ene idé danner grundlaget for al funktionel programmering. Når du behandler funktioner som tal eller strenge, kan du bygge fleksible værktøjer, der kan genbruges.
Gem en funktion i en variabel
Det navn, du giver en funktion, er i virkeligheden blot en variabel, der indeholder funktionsværdien. Du kan frit tildele denne værdi til en anden variabel.
Begge navnene nedenfor peger på den samme underliggende funktion, så et kald af enten navn udfører den samme kode.
local function greet(name)
return "Hello, " .. name
end
local hi = greet
print(greet("Ada"))
print(hi("Lin"))Anonyme funktioner
Du behøver ikke et navn for at oprette en funktion. En anonym funktion skrives med syntaksen function ... end og bruges direkte som en værdi.
At tildele en sådan funktion til en lokal variabel svarer til en normal funktionsdefinition, men den skrives direkte på stedet.
local square = function(x)
return x * x
end
print(square(5))
print(square(9))Funktioner som argumenter
Fordi funktioner er værdier, kan du sende dem til andre funktioner. En funktion, der modtager en anden funktion, kaldes en funktion af højere orden.
Her ved apply ikke, hvilket arbejde den skal udføre, før du giver den en funktion, som den skal køre.
local function apply(f, x)
return f(x)
end
local function double(n) return n * 2 end
print(apply(double, 10))
print(apply(function(n) return n + 1 end, 10))Returnér en funktion
En funktion kan returnere en anden funktion. Det gør det muligt at opbygge funktioner efter behov, konfigureret ud fra de argumenter, du sendte med.
Nedenfor opbygger multiplier en helt ny funktion hver gang og husker den faktor, du gav den.
local function multiplier(factor)
return function(x)
return x * factor
end
end
local triple = multiplier(3)
print(triple(4))
print(multiplier(10)(5))Lukninger indfanger variabler
Når en returneret funktion bruger en lokal variabel fra den omsluttende funktion, indfanger den denne variabel. Kombinationen af funktionen og de indfangede variabler kaldes en lukning.
Den indfangede factor forbliver tilgængelig, så længe lukningen eksisterer, også efter at det ydre kald er afsluttet.
local function counter()
local n = 0
return function()
n = n + 1
return n
end
end
local next = counter()
print(next())
print(next())
print(next())Funktioner i tabeller
Tabeller kan indeholde funktioner ligesom alle andre værdier. Det er sådan, Lua opbygger moduler og objekter: en tabel knytter navne til funktionsværdier.
Du kan slå en funktion op ved hjælp af en nøgle og kalde den eller endda gennemløbe en tabel med operationer.
local ops = {
add = function(a, b) return a + b end,
sub = function(a, b) return a - b end
}
print(ops.add(2, 3))
print(ops["sub"](9, 4))En tabel med strategier
Når du gemmer funktioner i en tabel, kan du vælge adfærd under kørsel ud fra en nøgle. Det erstatter lange if-else-kæder med et overskueligt opslag.
Hvis du vælger operationen ud fra dens navn, bliver den kaldende kode kort og nem at udvide med nye nøgler.
local dispatch = {
upper = string.upper,
lower = string.lower,
rev = string.reverse
}
local function run(name, s)
return dispatch[name](s)
end
print(run("upper", "lua"))
print(run("rev", "lua"))Tilbagekaldsfunktioner
Et tilbagekald er en funktion, du sender med, så den kan kaldes senere. Lua's standardbibliotek bruger dette mønster; table.sort modtager for eksempel en sammenligningsfunktion.
Tilbagekaldet bestemmer reglen, mens biblioteket håndterer gennemløbet og omarrangeringen.
local nums = {5, 2, 9, 1}
table.sort(nums, function(a, b)
return a > b
end)
print(table.concat(nums, ", "))Funktioner har identitet
Hver funktionsværdi er et særskilt objekt. To separate funktionslitteraler er aldrig ens, selv om de indeholder den samme kode.
Men en enkelt funktion, der er gemt i to variabler, sammenlignes som ens, fordi begge navne henviser til den samme værdi.
local f = function() return 1 end
local g = function() return 1 end
local h = f
print(f == g)
print(f == h)Hvorfor det er vigtigt
Når du behandler funktioner som værdier, kan du skrive generiske værktøjer én gang og tilpasse dem med de funktioner, du sender med. Afbildning, filtrering, delvis anvendelse og komposition bygger alle på dette.
Resten af dette kursus bygger praktiske mønstre oven på førsteklasses funktioner og lukninger.
Hurtigt tjek
Afprøv din forståelse af førsteklasses funktioner i Lua.
Opsummering
Funktioner i Lua er førsteklasses værdier: gem dem i variabler og tabeller, send dem som argumenter, og returnér dem fra andre funktioner.
Når du returnerer en funktion, der indfanger lokale variabler fra den omsluttende funktion, opretter du en lukning. Disse idéer er grundlaget for alle de funktionelle mønstre, der følger.
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 “Funktioner som værdier” gratis?
Ja — alle 3 lektioner i læringssporet Lua Academy, inklusive “Funktioner som værdier”, 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 “Funktioner som værdier”?
Gem og videregiv funktioner. 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 1 af 4.
Hvor lang tid tager lektionen “Funktioner som værdier”?
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
- Funktioner som værdier
- map, filter, reduce
- Partiel anvendelse
- Sammensæt funktioner