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 min

Volá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
2

Volá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 9

Bez 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í.

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á 1

Pod 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.5

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

4/11