Flere returverdier
Returner og hent flere verdier fra ett enkelt funksjonskall.
Flere returverdier er en gratis leksjon i Lua Academy på CoddyKit. Dette er leksjon 2 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.
Returnere flere verdier
I motsetning til de fleste språk kan Lua-funksjoner returnere flere verdier direkte fra én return-setning. Flere verdier skilles med komma etter return. Dermed trenger De verken omslagsobjekter eller ut-parametere.
local function divmod(a, b)
return math.floor(a / b), a % b
end
local quotient, remainder = divmod(17, 5)
print(quotient, remainder) -- 3 2Justere returverdier
Lua justerer returverdiene slik at de samsvarer med antallet mottakere. Overflødige verdier forkastes, og manglende verdier blir nil. Denne justeringen skjer når et funksjonskall ikke er det siste uttrykket i en liste – i den posisjonen beholdes bare den første verdien.
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 i en mellomposisjon
Når et funksjonskall står i midten av en uttrykksliste, altså ikke i den siste posisjonen, avkorter Lua det til én enkelt verdi. Bare det siste uttrykket i listen kan produsere flere verdier.
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 frem én verdi
Hvis De setter et funksjonskall i parentes, tvinges det til å returnere nøyaktig én verdi. Dette er nyttig når De bare vil ha den første returverdien, uansett hvor mange verdier funksjonen produserer.
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) -- 10Returverdier fra string.find
Mange funksjoner i standardbiblioteket bruker flere returverdier. string.find returnerer start- og sluttposisjonen for et treff, samt eventuelle grupper. math.modf returnerer heltalls- og brøkdelen. Når De forstår disse mønstrene, blir det enklere å bruke standardbiblioteket effektivt.
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.75Fange verdier med table.pack
table.pack(...) fanger alle argumenter, eller returverdier via ..., i en tabell. Tabellen inneholder feltet n med det totale antallet, inkludert nil-verdier. Dette bevarer det nøyaktige antallet, i motsetning til #, som stopper ved det første hullet.
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 for å spre verdier
table.unpack(t, i, j) returnerer elementene i en tabell som individuelle verdier. Det er det motsatte av table.pack. Bruk det for å sende innholdet i en tabell som argumenter til en funksjon eller for å spre verdier i en return-setning.
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 7Returverdier for feil
En vanlig Lua-konvensjon er å returnere nil, errorMessage ved feil og resultatet ved suksess. Kalleren kontrollerer den første returverdien: Hvis den er nil, har det oppstått en feil. Dette unngår unntak ved forventede feiltilfeller.
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)
endBytte med flere returverdier
Flere returverdier løser problemet med å bytte verdier på en elegant måte. Høyresiden evalueres før tilordningen, så a, b = b, a bytter verdiene korrekt uten 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 2Returkonvensjonen for pcall
pcall(f, ...) bruker selv flere returverdier: Den første verdien er en boolsk verdi (true ved suksess og false ved feil), mens de påfølgende verdiene enten er returverdiene fra f eller feilmeldingen. Kontroller alltid den første returverdien før De bruker 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 inputRask kontroll
Hva skriver print((string.find("hello", "ll"))) ut?
Oppsummering: Flere returverdier
Viktigste punkter:
- Returner flere verdier med
return a, b, c - Overflødige verdier forkastes, og manglende verdier blir nil
- Funksjonskall i mellomposisjon avkortes til én verdi
(f())tvinger frem nøyaktig én verditable.pack/table.unpackbrukes for dynamiske verdilister- Konvensjon: returner
nil, errmsgved feil
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 «Flere returverdier» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Lua Academy, inkludert «Flere returverdier», 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 «Flere returverdier»?
Returner og hent flere verdier fra ett enkelt funksjonskall. 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 2 av 4.
Hvor lang tid tar leksjonen «Flere returverdier»?
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