Funkce

Používáme je již od začátku našeho výukového seriálu. Jsou to funkce. Funkce jsou hodně důležité hned z mnoha důvodů: Ulehčují práci tím, že můžeme použít jednu funkci vícekrát, jednoduchá komunikace se hrou, atd... I náš obyčejný print co používáme je funkce.

Obyčejná funkce mimo třídu

Funkce se deklaruje pomocí klíčového slova function a názvu. Na název se vztahují stejná pravidla jako na proměnné (jen text a čísla - první znak nesmí být číslice). Následují kulaté závorky (), ve kterých jsou vypsány všechny parametry funkce. Nakonec nám funkce může, ale nemusí vráti nějakou hodnotu pomocí klíčového slova return. Příklad který si dále rozebereme:

1
2-- n?jake promenne mimo fci
3local a = 5;
4local b = 2;
5local c = scitej(a,b);
6print(c);
7
8-- deklarace funkce
9function scitej(a,b)
10 return(a+b);
11end;

Zde vidíte kód který využívá rovnou dvou funkcí - funkce print, která nám vypíše text do konzole/logu a funkci scitej kterou jsme si nadefinovali na řádku 9. Funkce scitej má dva vstupní parametry oddělené čárkou a to jsou a a b. Tyto parametry se uvnitř funkce chovají jako lokální proměnné a jejich název se může shodovat s čímkoli mimo funkci - jelikož se vytvoří lokálně mají větší váhu než globální (pokud je název stejný).

Pomocí klíčového slova return si na řádku 10 necháme vrátit součet obou vstupních parametrů. Dále si mimo funkci vyalokujeme proměnné a a b do kterých uložíme nějaké čísla. Další proměnnou je c na řádku 5 do které rovnou uložíme výsledek funkce scitej s parametry které jsou a (5) a b (2). Jakmile zavoláme funkci scitej, přesune se program na začátek deklarace funkce a provede kód až po první return na který narazí. Výsledek returnu se uloží do proměnné c kterou si vypíšu.

Návratové hodnoty funkcí

Funkce může a nemusí vracet hodnotu. My se teď zaměříme na ty funkce, které hodnotu vracejí. Funkce může vrátit jakoukoli hodnotu ke které má přístup. Dokonce může vracet i více hodnot. Nyní si ukážeme funkci která vrací jednu hodnotu.

1local plus = secti(2,5);
2print(plus);
3
4function secti(cislo1,cislo2)
5 return (cislo1+cislo2);
6end;

V příkladu můžeme vidět jednoduchou funkci na sčítání která vrátí součet dvou vstupních parametrů. Vracíme jednu hodnotu a ukládáme ji tak do jedné proměnné. Ale co když máme funkci která nám vrátí dvě proměnné? Jak si vlastně vytvoříme a zachytíme výstupní data? To vám nyní ukážu na příkladu a popíšeme si ho.

1
2-- chceme vratit nejmensi cislo v poli a jeho pozici
3local cisla = nasobkyCislaDoN(3,20);
4local nejmensi,poziceNejmensiho = minAPozice(cisla);
5print("Nejmensi cislo v poli je "..nejmensi.." a je na indexu"..poziceNejmensiho);
6
7-- s vynechanim promenne
8local _,poziceMin = minAPozice(cisla);
9print("Index minimalniho cisla je"..poziceMin);
10-- zde nezname to nejmensi cislo
11
12-- definice funkci
13function minAPozice(cisla)
14 local min;
15 local pozice;
16 local projel;
17 for k,v in ipairs(cisla) do
18 if projel == nil then
19 projel = true;
20 min = v;
21 pozice = k;
22 end;
23 if min > v then
24 min = v;
25 pozice = k;
26 end;
27 end;
28 return min,pozice;
29end;
30
31function nasobkyCislaDoN(cislo,doKdy)
32 local nasobky = {};
33 for i=1,doKdy do
34 nasobky[i] = i*cislo;
35 end;
36 return(nasobky);
37end;

Příklad ukazuje vrácení dvou hodnot (lze ale použít i pro více třeba pro 5). Docílíme toho tak, že mezi proměnné určené k návratu za klíčovým slovem return dáme čárku. Zachytávání výstupu do proměnných je potom stejné - mezi proměnné dám čárku. Pozor - pořadí zachytávaných proměnných je stejné, jako jsou zapsané ve funkci. Pokud nechceme jednu nebo více proměnných zachytit, pak použžijeme znak podtržítka (_) místo názvu proměnné. (viz řádek 8)

Break

Ačkoli to není přímo funkce, vztahuje se k nim alespoň z části a tak si ho zde ukážeme. Toto klíčové slovo se používá v cyklech a umožňují zastavení cyklu. Ukázu a popíšu:

1
2-- promenne
3local i = 1;
4local b = 5;
5while true do
6 if b >= 15 then
7 break;
8 end;
9 b = b * i;
10 i = i + 1;
11 print(b);
12end;
13-- vypise jen cisla 5,10 a 15
14

V ukázce máme příklad který používá cyklus. Příklad nám vypisuje násobky čísla 5 až do 15. Pokud se totiž podmínka na řádku 6 splní, cyklus bude ukončen a nespadneme tak do nekonečného zacyklení.

Použití break je tak jasné - break ukončí cyklus a už nic neporovnává.

Příklad na závěr

Nakonec zde uvedu jeden větší příklad který si můžete vyzkoušet a upravit. Čím více budete upravovat a cvičit, tím více pochopíte.

1--[[
2 Author: Martin Fabik
3 Predmet: Ukazkovy skript (cykly, funkce, break)
4]]--
5
6mujSkript = {};
7
8function mujSkript.prerequisitesPresent(specializations)
9 return true;
10end;
11
12function mujSkript:load(xmlFile)
13 local ciselka = nasobkyCislaDoN(5,15);
14 print("Sude cisla v poli ciselka:");
15 vypisKazdeSude(ciselka);
16 local maximalniCislo,licheCisla = kolikJeLichychAMaxCislo(ciselka);
17 print("Maximalni cislo je: "..maximalniCislo);
18 print("");
19 print("Pocet lichych v poli ciselka: "..licheCisla);
20 ciselka = nasobkyCislaDoN(3,10);
21 maximalniCislo,_ = kolikJeLichychAMaxCislo(ciselka);
22 print("");
23 print("Maximalni cislo pro 10 nasobku cisla 3: "..maximalniCislo);
24end;
25
26function mujSkript:mouseEvent(posX, posY, isDown, isUp, button)
27end;
28
29function mujSkript:keyEvent(unicode, sym, modifier, idDown)
30end;
31
32function mujSkript:update(dt)
33end;
34
35function mujSkript:updateTick(dt)
36end;
37
38function mujSkript:draw()
39end;
40
41function nasobkyCislaDoN(cislo,doKdy)
42 local nasobky = {};
43 for i=1,doKdy do
44 nasobky[i] = i*cislo;
45 end;
46 return(nasobky);
47end;
48
49function vypisKazdeSude(cisla)
50 for k,v in ipairs(cisla) do
51 if v%2 == 0 then
52 print(v);
53 end;
54 end;
55end;
56
57function kolikJeLichychAMaxCislo(cisla)
58 local liche = 0;
59 local maxCislo;
60 local projel;
61 for k,v in ipairs(cisla) do
62 if v%2 ~= 0 then
63 liche = liche + 1;
64 end;
65 if projel == nil then
66 projel = true;
67 maxCislo = v;
68 end;
69 if maxCislo < v then
70 maxCislo = v;
71 end;
72 end;
73 return maxCislo,liche;
74end;

Související video

Soubory ke stažení

  1. mujskript.lua