Lua Academy · leksjon

Flere returverdier

Returner og hent flere verdier fra ett enkelt funksjonskall.

Leksjon 2 av 412 trinn

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  2

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

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

Returverdier 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.75

Fange 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])        -- true

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

Returverdier 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)
end

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

Returkonvensjonen 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 input

Rask 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 verdi
  • table.pack/table.unpack brukes for dynamiske verdilister
  • Konvensjon: returner nil, errmsg ved feil
Gratis å komme i gang

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

  1. Definere og kalle funksjoner
  2. Flere returverdier
  3. Varargs og ...-operatoren
  4. Rekursjon i Lua
← Tilbake til Lua Academy