Lua Academy · Lektion

Flere returværdier

Returnér og modtag flere værdier fra ét enkelt funktionskald.

Lektion 2 af 412 trin

Flere returværdier er en gratis Lua Academy-lektion på CoddyKit. Dette er lektion 2 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.

Returnering af flere værdier

I modsætning til de fleste sprog kan Lua-funktioner naturligt returnere flere værdier fra én return-sætning. Flere værdier adskilles med kommaer efter return. Det eliminerer behovet for wrapper-objekter eller outputparametre.

local function divmod(a, b)
  return math.floor(a / b), a % b
end

local quotient, remainder = divmod(17, 5)
print(quotient, remainder)   -- 3  2

Justering af returværdier

Lua justerer returværdierne, så de passer til antallet af modtagere. Overskydende værdier kasseres, og manglende værdier bliver til nil. Denne justering sker, når et funktionskald ikke er det sidste udtryk i en liste — på den plads bevares kun den første værdi.

local function triple()
  return 10, 20, 30
end

local a, b, c = triple()
print(a, b, c)      -- 10  20  30

local x, y = triple()
print(x, y)         -- 10  20  (30 discarded)

local p = triple()
print(p)            -- 10  (only first when 1 var)

Justering på en mellemposition

Når et funktionskald står midt i en udtryksliste (ikke på den sidste plads), afkorter Lua det til én værdi. Kun det sidste udtryk i listen kan producere flere værdier.

local function pair()
  return 1, 2
end

-- pair() in middle: only 1 value used
local t = {pair(), pair()}
print(#t, t[1], t[2], t[3])  -- 3  1  1  2
-- first pair() gives just 1; last pair() gives 1,2

-- pair() at end: all values used
local t2 = {10, pair()}
print(#t2, t2[1], t2[2], t2[3])  -- 3  10  1  2

Parenteser tvinger én værdi

Hvis du omslutter et funktionskald med parenteser, tvinger du det til at returnere præcis én værdi. Det er nyttigt, når du kun vil have den første returværdi, uanset hvor mange værdier funktionen producerer.

local function coords()
  return 10, 20, 30
end

print(coords())    -- 10  20  30  (all three)
print((coords()))  -- 10  (parentheses: single value only)

local x = (coords())
print(x)           -- 10

Returværdier fra string.find

Mange funktioner i standardbiblioteket bruger flere returværdier. string.find returnerer start- og slutpositionen for et match (samt captures). math.modf returnerer heltals- og brøkdelen. Når du forstår disse mønstre, kan du bruge standardbiblioteket sikkert og flydende.

local s = "hello world"
local start, finish = string.find(s, "world")
print(start, finish)   -- 7  11

-- math.modf: integer and fractional parts
local int, frac = math.modf(3.75)
print(int, frac)       -- 3   0.75

Indfangning med table.pack

table.pack(...) indfanger alle argumenter (eller returværdier via ...) i en tabel. Tabellen indeholder feltet n med det samlede antal, inklusive nil-værdier. Det bevarer det præcise antal, i modsætning til #, som stopper ved det første hul.

local function getData()
  return "Alice", 30, nil, true
end

local t = table.pack(getData())
print(t.n)         -- 4
print(t[1])        -- Alice
print(t[2])        -- 30
print(t[3])        -- nil
print(t[4])        -- true

table.unpack til udfoldning

table.unpack(t, i, j) returnerer elementerne i en tabel som individuelle værdier. Det er det omvendte af table.pack. Brug det til at videregive en tabels indhold som argumenter til en funktion eller til at udfolde værdier i en return-sætning.

local args = {10, 20, 30}

local function sum3(a, b, c)
  return a + b + c
end

print(sum3(table.unpack(args)))  -- 60

-- Use in return
local function passThrough(t)
  return table.unpack(t)
end
print(passThrough({5, 6, 7}))   -- 5  6  7

Returværdier ved fejl

En almindelig Lua-konvention er at returnere nil, errorMessage ved fejl og resultatet ved succes. Kaldere kontrollerer den første returværdi: Hvis den er nil, er der opstået en fejl. Det undgår undtagelser ved forventelige fejltilfælde.

local function openConfig(path)
  local f = io.open(path, "r")
  if not f then
    return nil, "cannot open: " .. path
  end
  local content = f:read("*a")
  f:close()
  return content
end

local data, err = openConfig("config.lua")
if not data then
  print("Error:", err)
end

Ombytning med flere returværdier

Flere returværdier løser ombytningsproblemet elegant. Højresiden evalueres før tildelingen, så a, b = b, a bytter værdierne korrekt uden en midlertidig variabel.

local a, b = 5, 10
print(a, b)   -- 5  10

a, b = b, a
print(a, b)   -- 10  5

-- Works for three-way rotation too
local x, y, z = 1, 2, 3
x, y, z = z, x, y
print(x, y, z)  -- 3  1  2

pcall-konventionen for returværdier

pcall(f, ...) bruger selv flere returværdier: Den første værdi er en boolsk værdi (true ved succes, false ved fejl), og de efterfølgende værdier er enten returværdierne fra f eller fejlmeddelelsen. Kontrollér altid den første returværdi, før du bruger resten.

local function risky(x)
  if x < 0 then error("negative input") end
  return math.sqrt(x)
end

local ok, result = pcall(risky, 16)
print(ok, result)   -- true  4.0

ok, result = pcall(risky, -1)
print(ok, result)   -- false  input:2: negative input

Hurtigt tjek

Hvad udskriver print((string.find("hello", "ll")))?

Opsamling: Flere returværdier

Vigtigste pointer:

  • Returnér flere værdier: return a, b, c
  • Overskydende værdier kasseres, og manglende værdier bliver til nil
  • Kald på en mellemposition afkortes til én værdi
  • (f()) tvinger præcis én værdi frem
  • table.pack/table.unpack bruges til dynamiske lister med værdier
  • Konvention: returnér nil, errmsg ved fejl
Gratis at komme i gang

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 “Flere returværdier” gratis?

Ja — alle 3 lektioner i læringssporet Lua Academy, inklusive “Flere returvæ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 “Flere returværdier”?

Returnér og modtag flere værdier fra ét enkelt funktionskald. 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 2 af 4.

Hvor lang tid tager lektionen “Flere returvæ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

  1. Definition og kald af funktioner
  2. Flere returværdier
  3. Varargs og ...-operatoren
  4. Rekursion i Lua
← Tilbage til Lua Academy