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 Bellu

První čtyři řádky funkci vytvoří. Tomu se říká definice funkce a má tyto části:

  • local function definici začíná. local znamená 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á if a 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")
end

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

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

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

Nebo se registrujte pomocí:

1/11