Lua Academy · leksjon

Definere og kalle funksjoner

Lær syntaksen for funksjonsdeklarasjoner, kallkonvensjoner og lokale kontra globale funksjoner.

Leksjon 1 av 412 trinn

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

Returverdier

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  9

Funksjoner 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))   -- 20

Lokale 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 M

Metoder 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 overflow

Umiddelbart 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 here

Lagre 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.0

Closures 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 function for å 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
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 «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

  1. Definere og kalle funksjoner
  2. Flere returverdier
  3. Varargs og ...-operatoren
  4. Rekursjon i Lua
← Tilbake til Lua Academy