Cykly

Každý jazyk má nějaké cykly - kontrukce, které umožní vrátit se zpět v kódu a nějakou činnost opakovat vícekrát. Lua obsahuje čtyři typy cyklů. V tomto díle si je jednotlivě popíšeme a ukážeme si příklad ke každému z nich. Dávejte si pozor: podmínka u cyklů musí být splnitelná, nebo se dostanete do nekonečného cyklu a to se potom velmi těžko pracuje.

Cyklus while

Cyklus while je hojně využíván zejména k úlohám u kterých nevíme, zda se budou opakovat vícekrát nebo nevíme kolikrát přesně. jeho definice je while pravdivostní výraz do kód end;. Pokud je pravdivostní výraz true, je proveden kód v cyklu, jinak, pokud je výraz false je cyklus zastaven a program pokračuje na další instrukce. Pravdivostní výrazy používáme stejné jako u podmínek. Příklad k cyklu while:

1-- promenna
2local i = 1;
3while i <= 10 do
4 printf("i je mensi jak 10!");
5 i = i + 1;
6end;

Toto je velmi jednoduchá ukázka cyklu while. Všimněte si také zvyšování hodnoty proměnné i abychom zabránili vzniku nekonečného cyklu.

Cyklus repeat-until

Tento cyklus je hodně málo používaný - vlastně jsem ho ještě nikde neviděl ani nepoužil - ale i tak ho zde uvedu. Někomu se může hodit. Definice je repeat kód until podmínka. Zrada je zde v tom, že cyklus se právdí pokud je podmínka false. Rozdíl oproti cyklu while je v tom, že zde se první provede kód a poté se vyhodnotí podmínka a jestli se má opakovat cyklus. U while to bylo tak že se první vyhodnotila podmínka a poté až kód. Ukázka cyklu repeat-until:

1-- promenna
2local i = 1;
3repeat
4 print("i je mensi nez 10");
5 i = i + 1;
6until (i > 10);

Takový cyklus využijete třeba u něčeho, co se musí provést minimálně jednou. Jinak v něm nevydím zas až takové využití.

Numerický for

V lua je také cyklus for který se dělí na dva typy: numerický a generický. Numerický si ukážeme teď a ten generický až poté. Rozdíl mezi numerickým a generickým forem je takový, že u numerického se zadávají parametry přímo a u generického jsou generovány automaticky.

Syntaxe numerického foru je následující: for počátek_cyklu, konec_cyklu, krok do kód end;. Pořátek cyklu musí být proměnná a můžu jí přímo na místě přiřadit hodnotu. Konec cyklu je číslo, které zastaví cyklus, jakmile dosáhne proměnná z počátku cyklu dané hodnoty. Polední je nepovinný parametr krok, který určuje o kolik se má zvýšit hodnota z počátku cyklu.Pokud není určen, je jeho hodnota 1. Výhoda cyklu for je taková, že si sám deklaruje řídící proměnnou. Nevýhoda je, že ta proměnná je lokální pouze pro daný cyklus. Příklad for:

1-- promenna
2local j = 1;
3
4-- for s lokalni promennou
5for i=1,10 do
6 print("i je mensi nez 10"); -- 10x
7end;
8
9-- for s globalni promennou
10for j,10 do
11 print("j je mensi nez 10"); -- 10x
12end;
13
14-- for s krokem desetinnym
15for i=1,10,0.5 do
16 print("i je mensi nez 10"); -- 20x
17end;
18
19-- for s krokem zapornym
20for i=10,1,-1 do
21 print("i je mensi nez 10"); -- 10x
22end;

Místo druhého parametru (koncový bod cyklu) lze zadat také proměnnou - pak můžeme dynamicky měnit konec cyklu.

Generický for

Generický for se využívá zejména pro procházení tabulek. Používá se zde jiné syntaxe než u numerického a používá tzv. iterátory. Iterátor je funkce, která nám vrací nějakou hodnotu z něčeho a řídí cyklus. O iterátorech bude řeč později - my si teď ukážeme dva nejpoužívanější z nich.

První varianta je cyklus for, který nám projde tabulku a klíče i hodnoty uloží do proměnných, které si sám vyalokuje. Syntaxe je for klic,hodnota in ipairs(tabulka) do kód end;. Projde celou tabulku 'tabulka' a přitom uloží její klíč a příslušnou hodnotu do daných proměnných, jejihž pořadí je neměnné. Funkce ipairs prochází pouze hodnoty klasicky indexované. Ukázka generického foru používajícího ipairs:

1-- tabulka
2local tabulka = {"1","8","6","5","2"};
3
4-- genericky for pouzivajici jako iterator ipairs
5for klic,hodnota in ipairs(tabulka) do
6 print("Hodnota v tabulce na indexu "..klic.." je "..hodnota);
7 -- jako vypis dostaneme n?co jako "... na indexu 1 je 1"
8 -- ... na indexu 2 je 8
9 -- atd...
10end;

Další možností využití generického foru je procházení tabulky i pro nestandardní klíče. Rozdíl není velký - je místo ipairs píšeme pairs. Ukázka:

1-- tabulka
2local tabulka = {"1","8","6","5","2"};
3
4-- genericky for pouzivajici jako iterator pairs
5print("indexy tabulky:")
6for klic in pairs(tabulka) do
7 print(klic);
8end;
9-- vysledkem bude neco jako:
10-- indexy tabulky:
11-- 1
12-- 2
13-- 3
14-- 4
15-- atd...

Využití v příkladu je velmi omezené. Až se dostaneme k pokročilejší práci s tabulky, tak si ukážeme víc.

Související video

Soubory ke stažení

  1. mujskript.lua (video)