Lua Academy · Lektion

Flera returvärden

Returnera och fånga flera värden från ett enda funktionsanrop.

Lektion 2 av 412 steg

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  2

Anpassning 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  2

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

Returvä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.75

Få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])        -- true

table.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  7

Returvä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)
end

Byta 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  2

pcall: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 input

Snabbkontroll

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ärde
  • table.pack/table.unpack används för dynamiska värdelistor
  • Konvention: returnera nil, errmsg vid fel
Gratis att börja

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.

Alla lektioner i den här kursen

  1. Definiera och anropa funktioner
  2. Flera returvärden
  3. Varargs och operatorn ...
  4. Rekursion i Lua
← Tillbaka till Lua Academy