Flera returvärden
Returnera och fånga flera värden från ett enda funktionsanrop.
Flera returvärden är en gratis lektion i Lua Academy på CoddyKit. Detta är lektion 2 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Lua Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Lua Academy innehåller totalt 4 lektioner.
Returnera flera värden
Till skillnad från de flesta språk kan Lua-funktioner direkt returnera flera värden från en enda return-sats. Flera värden separeras med kommatecken efter return. Då behövs varken omslutande objekt eller utdataparametrar.
local function divmod(a, b)
return math.floor(a / b), a % b
end
local quotient, remainder = divmod(17, 5)
print(quotient, remainder) -- 3 2Anpassning av returvärden
Lua anpassar returvärdena efter antalet mottagare. Överflödiga värden tas bort och saknade värden blir nil. Anpassningen sker närhelst ett funktionsanrop inte är det sista uttrycket i en lista – på den platsen behålls endast det första värdet.
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)Anpassning i mittenposition
När ett funktionsanrop förekommer i mitten av en uttryckslista, alltså inte på den sista platsen, trunkerar Lua det till ett enda värde. Endast det sista uttrycket i listan kan producera flera värden.
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 tvingar fram ett enda värde
Om du omger ett funktionsanrop med parenteser tvingas det att returnera exakt ett värde. Det är användbart när du bara vill ha det första returvärdet, oavsett hur många värden funktionen producerar.
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ärden från string.find
Många funktioner i standardbiblioteket använder flera returvärden. string.find returnerar start- och slutpositionerna för en träff, samt eventuella fångster. math.modf returnerar heltals- och decimaldelen. Om du förstår dessa mönster kan du använda standardbiblioteket obehindrat.
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.75Fånga värden med table.pack
table.pack(...) fångar alla argument, eller returvärden via ..., i en tabell. Tabellen innehåller fältet n med det totala antalet, inklusive nil-värden. Det bevarar det exakta antalet, till skillnad från # som stannar vid det första hålet.
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 för att sprida värden
table.unpack(t, i, j) returnerar tabellens element som enskilda värden. Det är motsatsen till table.pack. Använd det för att skicka en tabells innehåll som argument till en funktion eller för att sprida värden i en return-sats.
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ärden enligt felkonvention
En vanlig Lua-konvention är att returnera nil, errorMessage vid fel och resultatet vid lyckat resultat. Anroparen kontrollerar det första returvärdet: om det är nil har ett fel inträffat. På så sätt undviks undantag vid förväntade fel.
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)
endByta plats med flera returvärden
Flera returvärden löser problemet med att byta plats på ett elegant sätt. Högerledet evalueras före tilldelningen, så a, b = b, a byter korrekt plats på värdena utan en temporär 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:s returkonvention
pcall(f, ...) använder själv flera returvärden: det första värdet är en boolesk variabel (true vid lyckat resultat, false vid fel), och de efterföljande värdena är antingen returvärdena från f eller felmeddelandet. Kontrollera alltid det första returvärdet innan du använder 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 inputSnabbkontroll
Vad skriver print((string.find("hello", "ll"))) ut?
Repetition: Flera returvärden
Viktigaste punkterna:
- Returnera flera värden:
return a, b, c - Överflödiga värden tas bort och saknade värden blir nil
- Anrop i mittenposition trunkeras till ett värde
(f())tvingar fram exakt ett värdetable.pack/table.unpackanvänds för dynamiska värdelistor- Konvention: returnera
nil, errmsgvid fel
Lär dig Lua med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 40
- Lektioner
- 159
Vanliga frågor
Är lektionen ”Flera returvärden” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Lua Academy, inklusive ”Flera returvärden”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Lua Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Flera returvärden”?
Returnera och fånga flera värden från ett enda funktionsanrop. Ni övar på Lua Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Lua Academy?
Du behöver inga förkunskaper. Utbildningen i Lua Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.
Hur lång tid tar lektionen ”Flera returvärden”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Lua Academy-lektionen?
Ja. Varje Lua Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.