Návratové hodnoty

Funkce, které jste zatím napsali, něco vypíšou, a tím to končí. Často ale chcete, aby funkce spočítala hodnotu, se kterou program dál pracuje: sečte ji, porovná, uloží. Pak funkce hodnotu vrátí pomocí return:

local function hodnotaSklizne(pocet, cena)
    return pocet * cena
end

local mrkev = hodnotaSklizne(12, 5)
print("Mrkev: " .. mrkev .. " mincí")
print("Dýně: " .. hodnotaSklizne(4, 20) .. " mincí")

Vypíše:

Mrkev: 60 mincí
Dýně: 80 mincí

Volání hodnotaSklizne(12, 5) spustí funkci a return pošle 60 zpátky na místo volání. Můžete si představit, že Lua volání nahradí vrácenou hodnotou, takže z local mrkev = hodnotaSklizne(12, 5) se stane local mrkev = 60. Této hodnotě se říká návratová hodnota funkce. Volání můžete použít všude, kam byste napsali hodnotu: do proměnné, do print, do výpočtu nebo do podmínky, třeba if hodnotaSklizne(12, 5) > 50 then. Takové funkce už znáte: math.max(3, 8) vrátí 8 a tostring(5) vrátí "5".

return navíc funkci hned ukončí. Spolu s podmínkami tak vznikají krátké funkce, které v různých případech vracejí různé hodnoty:

local function prodejniCena(plodina)
    if plodina == "mrkev" then
        return 5
    elseif plodina == "brambory" then
        return 8
    end
    return 0
end

print(prodejniCena("brambory"), prodejniCena("mrkev"), prodejniCena("kámen"))

Vypíše:

8	5	0

Pro "brambory" se provede druhý return a funkce skončí: k return 0 se Lua vůbec nedostane. Dostane se k němu, jen když neplatí žádná podmínka. V Lua musí být return posledním řádkem svého bloku (těsně před end, else nebo elseif). Řádek za ním ve stejném bloku je syntaktická chyba: 'end' expected … near 'print'.

Začátečníci si často pletou print a return, protože se zdá, že obojí „dává hodnotu ven“. Jenže print hodnotu jen ukáže vám, ve výstupu, a program s ní dál pracovat nemůže. return hodnotu předá programu. Podívejte se na funkci, která výsledek vypíše, místo aby ho vrátila:

local function hodnotaSklizne(pocet, cena)
    print(pocet * cena)
end

local mrkev = hodnotaSklizne(12, 5)
print(mrkev)
print(mrkev + 10)

Vypíše:

60
nil
main.lua:7: attempt to perform arithmetic on a nil value (local 'mrkev')

60 vypsal print uvnitř funkce. Funkce ale nic nevrátila, takže mrkev je nil a výpočet skončí chybou. Když uvidíte nil tam, kde jste čekali výsledek funkce, zkontrolujte, jestli funkce má return. Dobré pravidlo: funkce, která něco počítá, výsledek vrátí, a kód, který ji zavolal, rozhodne, jestli ho vypíše, uloží, nebo s ním bude dál počítat.

Pokyny

Program vypíše 60 a 32 a pak skončí chybou main.lua:8: attempt to perform arithmetic on a nil value (local 'mrkev'). Funkce trzba cenu vypisuje, místo aby ji vrátila. Opravte ji, aby program vypsal Celkem: 92 mincí.

Na konci programu napište funkci prodejniCena s parametrem plodina. Vrátí, kolik mincí Ema dostane za jeden kus: 5 za "mrkev", 8 za "brambory", 20 za "dýně" a 0 za cokoli jiného. Pak jedním print vypište prodejniCena("dýně"), prodejniCena("mrkev") a prodejniCena("kámen"). Program vypíše:

20	5	0

Teď použijte obě funkce dohromady. Na konec programu přidejte seznamy toho, co Ema dnes prodala:

local plodiny = {"mrkev", "brambory", "dýně", "mrkev"}
local pocty = {10, 5, 2, 4}

Projděte seznamy cyklem for a pro každé i přičtěte trzba(pocty[i], prodejniCena(plodiny[i])). Lua nejdřív zavolá prodejniCena a cenu, kterou funkce vrátí, předá funkci trzba. Po cyklu vypište celkovou tržbu: Tržba celkem: 150 mincí.

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

3/11