Lua Academy · Oppitunti

Useat paluuarvot

Palauttakaa ja tallentakaa useita arvoja yhdestä funktiokutsusta.

Oppitunti 2/412 vaihetta

Useat paluuarvot on ilmainen Lua Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Lua Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Lua Academy-kurssilla on yhteensä 4 oppituntia.

Usean arvon palauttaminen

Toisin kuin useimmissa kielissä, Lua-funktiot voivat palauttaa useita arvoja natiivisti yhdestä return-lauseesta. Useat arvot erotetaan pilkuilla return-sanan jälkeen. Tällöin ei tarvita kääreobjekteja tai tulosparametreja.

local function divmod(a, b)
  return math.floor(a / b), a % b
end

local quotient, remainder = divmod(17, 5)
print(quotient, remainder)   -- 3  2

Palautettujen arvojen mukauttaminen

Lua mukauttaa palautettujen arvojen määrän vastaanottajien määrää vastaavaksi. Ylimääräiset arvot hylätään ja puuttuvien arvojen tilalle tulee nil. Tämä mukautus tapahtuu aina, kun funktiokutsu ei ole lausekelistan viimeinen lauseke — kyseisessä kohdassa säilytetään vain ensimmäinen arvo.

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)

Keskellä olevan kohdan mukautus

Kun funktiokutsu on lausekelistan keskellä (ei viimeisessä kohdassa), Lua lyhentää sen yhdeksi arvoksi. Vain listan viimeinen lauseke voi tuottaa useita arvoja.

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

Sulkeet pakottavat yhden arvon

Funktiokutsun ympäröiminen sulkeilla pakottaa sen palauttamaan täsmälleen yhden arvon. Tästä on hyötyä, kun haluatte vain ensimmäisen palautetun arvon riippumatta siitä, kuinka monta arvoa funktio tuottaa.

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

string.find-funktion palauttamat arvot

Monet standardikirjaston funktiot käyttävät useita palautusarvoja. string.find palauttaa osuman alku- ja loppusijainnit (sekä kaappaukset). math.modf palauttaa kokonaisluku- ja murto-osan. Näiden mallien ymmärtäminen auttaa käyttämään standardikirjastoa sujuvasti.

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

Arvojen kaappaaminen table.pack-funktiolla

table.pack(...) kaappaa kaikki argumentit (tai ...-syntaksin kautta palautetut arvot) taulukkoon. Taulukossa on n-kenttä, joka sisältää kokonaismäärän myös nil-arvot mukaan lukien. Näin täsmällinen määrä säilyy, toisin kuin #-operaattoria käytettäessä, sillä se pysähtyy ensimmäiseen aukkoon.

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 arvojen levittämiseen

table.unpack(t, i, j) palauttaa taulukon alkiot yksittäisinä arvoina. Se on table.pack-funktion käänteisoperaatio. Käyttäkää sitä taulukon sisällön välittämiseen funktion argumenteiksi tai arvojen levittämiseen return-lauseessa.

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

Virheiden ilmoittaminen palautusarvoilla

Lua-kielessä yleinen käytäntö on palauttaa epäonnistumisen yhteydessä nil, errorMessage ja onnistumisen yhteydessä tulos. Kutsuja tarkistaa ensimmäisen palautusarvon: jos se on nil, tapahtui virhe. Näin poikkeuksia ei tarvita odotettavissa olevien virhetilanteiden käsittelyyn.

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

Arvojen vaihtaminen useilla palautusarvoilla

Useat palautusarvot ratkaisevat vaihtamisongelman elegantisti. Oikea puoli arvioidaan ennen sijoittamista, joten a, b = b, a vaihtaa arvot oikein ilman väliaikaista muuttujaa.

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-funktion palautuskäytäntö

pcall(f, ...) käyttää itse useita palautusarvoja: ensimmäinen arvo on totuusarvo (true, jos suoritus onnistui, ja false, jos tapahtui virhe), ja seuraavat arvot ovat joko funktion f palautusarvoja tai virheilmoitus. Tarkistakaa aina ensimmäinen palautusarvo ennen muiden käyttämistä.

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

Pikatarkistus

Mitä print((string.find("hello", "ll"))) tulostaa?

Kertaus: Useat palautusarvot

Tärkeimmät opit:

  • Palauttakaa useita arvoja: return a, b, c
  • Ylimääräiset arvot hylätään ja puuttuvien tilalle tulee nil
  • Keskellä olevat funktiokutsut lyhennetään yhdeksi arvoksi
  • (f()) pakottaa palauttamaan täsmälleen yhden arvon
  • table.pack/table.unpack dynaamisille arvolistoille
  • Käytäntönä epäonnistumisesta palautetaan nil, errmsg
Aloita maksutta

Opi Lua tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
40
Oppitunnit
159

Usein kysytyt kysymykset

Onko oppitunti ”Useat paluuarvot” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Lua Academy-oppimispolun 3 oppituntia, myös oppitunnin “Useat paluuarvot”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Lua Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Useat paluuarvot”?

Palauttakaa ja tallentakaa useita arvoja yhdestä funktiokutsusta. Harjoittelet Lua Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Lua Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Lua Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Useat paluuarvot”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Lua Academy-oppitunnilla?

Kyllä. Jokainen Lua Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Funktioiden määrittely ja kutsuminen
  2. Useat paluuarvot
  3. Varargs ja ...-operaattori
  4. Rekursio Luassa
← Takaisin: Lua Academy