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 0Pro "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.
Jak psát:
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 0Teď 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
3/11