Definere og kalle funksjoner
Lær syntaksen for funksjonsdeklarasjoner, kallkonvensjoner og lokale kontra globale funksjoner.
Definere og kalle funksjoner 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.
Funksjonssyntaks
Funksjoner i Lua defineres med nøkkelordet function. Kroppen er en blokk som avsluttes med end. Funksjoner kan være globale eller lokale. De kaller en funksjon ved å sette parenteser med argumenter etter funksjonsnavnet. Hvis De utelater argumenter, får manglende parametere verdien nil.
function sayHello(name)
print("Hello, " .. (name or "World") .. "!")
end
sayHello("Lua") -- Hello, Lua!
sayHello() -- Hello, World!
local function add(a, b)
return a + b
end
print(add(3, 4)) -- 7Returverdier
Funksjoner returnerer verdier med return. I motsetning til de fleste språk kan Lua-funksjoner returnere flere verdier. Hvis De ikke returnerer noe uttrykkelig, returnerer funksjonen ingenting (null verdier). Overflødige returverdier forkastes når kallet ikke er det siste uttrykket i en liste.
local function minMax(t)
local lo, hi = t[1], t[1]
for i = 2, #t do
if t[i] < lo then lo = t[i] end
if t[i] > hi then hi = t[i] end
end
return lo, hi
end
local lo, hi = minMax({5,2,8,1,9})
print(lo, hi) -- 1 9Funksjoner som verdier
Funksjoner er førsteklasses verdier i Lua. De kan lagre dem i variabler, sende dem som argumenter til andre funksjoner og returnere dem. Dette muliggjør callbacks, høyereordensfunksjoner og mønstre fra funksjonell programmering.
local ops = {
add = function(a, b) return a + b end,
sub = function(a, b) return a - b end,
mul = function(a, b) return a * b end,
}
local function apply(op, a, b)
return op(a, b)
end
print(apply(ops.add, 10, 3)) -- 13
print(apply(ops.mul, 4, 5)) -- 20Lokale kontra globale funksjoner
Bruk local function for hjelpere som er private i modulen. Globale funksjoner forsøpler det globale navnerommet og er tilgjengelige overalt, noe som kan føre til navnekonflikter. I de fleste tilfeller bør De foretrekke lokale funksjoner og bare eksponere det De trenger, gjennom en modultabell.
-- Bad: pollutes global namespace
function helper() end
-- Good: module-local
local function helper()
return "I am local"
end
-- Module export pattern
local M = {}
function M.publicFunc()
return helper() -- can call local
end
return MMetoder med kolon-syntaks
Lua tilbyr syntaktisk sukker for å definere og kalle metoder på tabeller. obj:method(arg) tilsvarer obj.method(obj, arg). Kolonformen sender tabellen implisitt som det første argumentet, som konvensjonelt kalles self.
local Dog = {}
Dog.__index = Dog
function Dog.new(name)
return setmetatable({name=name}, Dog)
end
function Dog:speak()
print(self.name .. " says: Woof!")
end
local d = Dog.new("Rex")
d:speak() -- Rex says: Woof!Mønster for valgfrie parametere
Lua har ingen innebygde valgfrie parametere, men De kan simulere dem ved å kontrollere om verdien er nil. Send én options-tabell til funksjoner med mange valgfrie parametere – dette er ryddigere enn en lang argumentliste.
local function createUser(name, opts)
opts = opts or {}
return {
name = name,
role = opts.role or "user",
active = opts.active ~= false,
score = opts.score or 0,
}
end
local u = createUser("Alice", {role="admin", score=100})
print(u.name, u.role, u.score)Tail calls
Et tail call er et funksjonskall i siste posisjon (den siste handlingen før retur). Lua utfører optimalisering av tail calls: Et korrekt tail call bruker ikke ekstra stakkplass. Dette muliggjør dyp rekursjon uten stack overflow når det rekursive kallet står i siste posisjon.
local function factorial(n, acc)
acc = acc or 1
if n <= 1 then return acc end
return factorial(n - 1, n * acc) -- tail call!
end
print(factorial(10)) -- 3628800
-- Can handle very large n without stack overflowUmiddelbart kalte funksjoner
De kan definere og kalle en funksjon umiddelbart: (function() ... end)(). Dette er nyttig for å opprette et lokalt scope, kjøre oppsettskode nøyaktig én gang eller unngå å forsøple det ytre scopet med midlertidige variabler.
local result = (function()
local temp = 100
local adjusted = temp * 1.5
return math.floor(adjusted)
end)()
print(result) -- 150
-- temp and adjusted not visible hereLagre funksjoner i tabeller
Å lagre funksjoner i tabeller er idiomatisk utforming av Lua-moduler. Tabellen fungerer som et navnerom. De definerer funksjoner ved å tilordne dem til tabellfelter eller bruke punktum-/kolonnotasjon med tabellnavnet.
local math2 = {}
function math2.clamp(val, lo, hi)
return math.max(lo, math.min(hi, val))
end
function math2.lerp(a, b, t)
return a + (b - a) * t
end
print(math2.clamp(150, 0, 100)) -- 100
print(math2.lerp(0, 10, 0.5)) -- 5.0Closures som callbacks
Høyereordensfunksjoner tar imot callbacks. I Lua er callbacks ganske enkelt funksjonsverdier. Closures er spesielt nyttige som callbacks fordi de fanger konteksten for kallet uten at De trenger å sende ekstra argumenter gjennom høyereordensfunksjonen.
local function forEach(t, fn)
for i, v in ipairs(t) do
fn(v, i)
end
end
local sum = 0
forEach({10, 20, 30}, function(v)
sum = sum + v
end)
print(sum) -- 60
forEach({"a","b","c"}, function(v, i)
print(i, v)
end)Hurtigsjekk
Hva blir resultatet av: local function f() return 1, 2, 3 end; local a, b = f()?
Oppsummering: Funksjoner
Viktige punkter:
- Bruk
local functionfor å unngå å forurense globale variabler - Funksjoner er førsteklasses verdier: lagre dem i variabler og tabeller, og send dem som argumenter
- Kolonsyntaksen sender implisitt
self - Simuler valgfrie parametere med
opts or {} - Tail calls hindrer stack overflow ved dyp rekursjon
- Funksjoner som kalles umiddelbart, oppretter isolerte scopes
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 «Definere og kalle funksjoner» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Lua Academy, inkludert «Definere og kalle funksjoner», 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 «Definere og kalle funksjoner»?
Lær syntaksen for funksjonsdeklarasjoner, kallkonvensjoner og lokale kontra globale funksjoner. 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 «Definere og kalle funksjoner»?
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
- Definere og kalle funksjoner
- Flere returverdier
- Varargs og ...-operatoren
- Rekursjon i Lua