Definice funkcí
V této lekci budete psát vlastní funkce. Několik funkcí, které jsou součástí Lua, už znáte: print, math.floor, table.insert. Každá z nich je kus kódu, který někdo jednou napsal a pojmenoval, takže ho můžete spustit jedním řádkem, kolikrát potřebujete.
Stejně vám pomůžou i vaše vlastní funkce. Ema dělá každé ráno stejnou práci a program, který by ji vypsal na celý týden, by opakoval stejné řádky sedmkrát. Kdyby chtěla přidat další úkol, musela by ho dopsat na sedm míst a jedno by určitě vynechala. Místo toho řádky napíšete jednou a pojmenujete je. Takový pojmenovaný kus kódu je funkce. Tento program vytvoří funkci s Eminou ranní prací a pak ji spustí pro dva dny:
local function ranniPrace()
print("Nakrmit slepice")
print("Podojit Bellu")
end
print("Pondělí")
ranniPrace()
print("Úterý")
ranniPrace()Vypíše:
Pondělí
Nakrmit slepice
Podojit Bellu
Úterý
Nakrmit slepice
Podojit BelluPrvní čtyři řádky funkci vytvoří. Tomu se říká definice funkce a má tyto části:
local functiondefinici začíná.localznamená totéž co u proměnných: funkce patří tomuto programu. Proč na tom záleží, uvidíte později v této lekci.- Název, tady
ranniPrace. Platí pro něj stejná pravidla jako pro názvy proměnných a také se píše camelCase. Vyberte název, který říká, co funkce dělá. - Závorky
(). Zatím jsou prázdné. Co do nich patří, zjistíte v dalším cvičení. - Tělo funkce: řádky, které funkce provede, odsazené o 4 mezery.
end, které funkci uzavře, stejně jako uzavíráifa cykly.
Samotná definice nic nespustí. Bez řádků pod ní by program nevypsal nic a nebyla by to chyba: definice jen říká, co má funkce dělat, jako recept zapsaný v sešitě. Aby se funkce provedla, musíte ji zavolat: napíšete její název a závorky, ranniPrace().
Lua provádí program shora dolů. Definici jen projde a funkci si zapamatuje. Pak vypíše Pondělí a při volání skočí do funkce, provede její tělo a pokračuje řádkem za voláním. Volání nejsou odsazená, protože nepatří do těla funkce. Prázdný řádek za end není povinný, ale program se s ním lépe čte.
Funkci volají až závorky. Samotný název na řádku, ranniPrace, je syntaktická chyba. A print(ranniPrace) funkci také nespustí: vypíše něco jako function: 0x10ead0, tak Lua vypisuje samotnou funkci.
Funkce existuje až od řádku, kde je definovaná. Zavolat ji dřív je častá chyba:
ranniPrace()
local function ranniPrace()
print("Nakrmit slepice")
endProgram skončí chybou:
main.lua:1: attempt to call a nil value (global 'ranniPrace')Na řádku 1 Lua žádné ranniPrace ještě nezná, takže tento název má hodnotu nil a nil zavolat nejde („attempt to call a nil value“). Co znamená global, se dozvíte později v této lekci. Stejnou chybu dostanete, když název ve volání napíšete jinak než v definici, třeba RanniPrace(): na velkých a malých písmenech záleží. Proto se funkce definují na začátku programu a volají se až pod definicí.
Jak psát:
Pokyny
Každý tržní den program vypíše den a ceduli Emina stánku, takže tři řádky cedule jsou v programu dvakrát. Pod komentářem na začátku definujte lokální funkci vypisCeduli, jejíž tělo vypíše tři řádky cedule. Spusťte program: vypíše totéž co předtím, protože funkci zatím nikdo nevolá.
Tři řádky cedule pod Pondělí i pod Úterý nahraďte voláním vypisCeduli. Pak přidejte třetí tržní den: vypište Středa a zavolejte vypisCeduli ještě jednou. Výstup končí takto:
Středa
================
Farma Slunečnice
================Ema chce, aby cedule říkala, co prodává. Do těla funkce vypisCeduli přidejte řádek, který vypíše Čerstvá zelenina, mezi Farma Slunečnice a spodní čáru. Spusťte program: změnily se všechny tři cedule. Změnili jste kód na jednom místě a všechna tři volání dělají něco nového. Přesně k tomu jsou funkce dobré. Program vypíše:
Pondělí
================
Farma Slunečnice
Čerstvá zelenina
================
Úterý
================
Farma Slunečnice
Čerstvá zelenina
================
Středa
================
Farma Slunečnice
Čerstvá zelenina
================Začněte programovat zdarma
1/11