Více návratových hodnot
V mnoha jazycích vrací funkce nanejvýš jednu hodnotu. V Lua může return vrátit několik hodnot oddělených čárkami. Ema si zapisuje, kolik minut jí trvá práce na farmě, a tato funkce převede minuty na hodiny a minuty:
local function hodinyAMinuty(minuty)
return minuty // 60, minuty % 60
end
local hodiny, zbytek = hodinyAMinuty(135)
print(hodiny .. " h " .. zbytek .. " min")Vypíše:
2 h 15 minVolání vrátí dvě hodnoty a ty se uloží do proměnných podle pořadí: první do hodiny, druhá do zbytek. Lua umí přiřadit víc proměnných najednou kdekoli, nejen u funkcí: local a, b = 1, 2. Když je proměnných víc než hodnot, přebývající proměnné dostanou nil, přebývající hodnoty se zahodí. Když potřebujete jen druhou hodnotu, napište místo první _, jako u ipairs: local _, zbytek = hodinyAMinuty(135).
print vypíše všechny hodnoty, které funkce vrátí, oddělené tabulátory. Ale pozor, co se stane, když volání není poslední:
local function hodinyAMinuty(minuty)
return minuty // 60, minuty % 60
end
print(hodinyAMinuty(135))
print(hodinyAMinuty(135), "hodiny")
print((hodinyAMinuty(135)))Vypíše:
2 15
2 hodiny
2Volání dá všechny své hodnoty, jen když je poslední (nebo jedinou) položkou seznamu hodnot, třeba argumentů funkce print. Jinde se použije jen jeho první hodnota, takže druhý řádek vypíše 2 a hodiny a 15 se ztratí. Jen první hodnotu nechají i závorky navíc kolem volání, jako na třetím řádku.
Víc návratových hodnot se hodí, když funkce zjistí několik věcí najednou. Tato funkce projde seznam jednou a vrátí jeho nejmenší i největší číslo:
local function nejmensiANejvetsi(seznam)
local nejmensi = seznam[1]
local nejvetsi = seznam[1]
for _, hodnota in ipairs(seznam) do
nejmensi = math.min(nejmensi, hodnota)
nejvetsi = math.max(nejvetsi, hodnota)
end
return nejmensi, nejvetsi
end
local nejmensi, nejvetsi = nejmensiANejvetsi({7, 3, 9, 4})
print("Od " .. nejmensi .. " do " .. nejvetsi)Vypíše:
Od 3 do 9Bez více návratových hodnot byste potřebovali dvě funkce a seznam by se procházel dvakrát. Obě hodnoty patří do jednoho return, oddělené čárkou. Dva return za sebou nefungují: první by funkci ukončil a Lua za return žádný řádek ani nedovolí.
Jak psát:
Pokyny
Ema balí vejce do krabiček po 6. Program skončí chybou attempt to call a nil value (global 'zabalVejce'), protože funkce ještě neexistuje. Napište ji nad cyklus: zabalVejce má parametr vejce a vrátí dvě hodnoty: kolik plných krabiček po 6 vejcích Ema naplní a kolik vajec zbude. Program pak vypíše:
Den 1: krabiček 3, zbývá 2
Den 2: krabiček 5, zbývá 1
Den 3: krabiček 2, zbývá 0
Den 4: krabiček 3, zbývá 0
Den 5: krabiček 4, zbývá 1Pod cyklus napište funkci soucetAPrumer s parametrem seznam. Vrátí dvě hodnoty: součet čísel v seznamu a jejich průměr. Použijte ji pro tyden a pak pro seznam {6, 9} a výsledky vypište takto:
Součet: 106, průměr: 21.2
Součet: 15, průměr: 7.5Začněte programovat zdarma
4/11