Flere returværdier
Returnér og modtag flere værdier fra ét enkelt funktionskald.
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 2Justering 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 2Parenteser 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) -- 10Returvæ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.75Indfangning 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]) -- truetable.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 7Returvæ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)
endOmbytning 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 2pcall-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 inputHurtigt 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 fremtable.pack/table.unpackbruges til dynamiske lister med værdier- Konvention: returnér
nil, errmsgved fejl
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
- Definition og kald af funktioner
- Flere returværdier
- Varargs og ...-operatoren
- Rekursion i Lua