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-- promenna2local i = 1;3while i <= 10 do4 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-- promenna2local i = 1;3repeat4 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-- promenna2local j = 1;34-- for s lokalni promennou5for i=1,10 do6 print("i je mensi nez 10"); -- 10x7end;89-- for s globalni promennou10for j,10 do11 print("j je mensi nez 10"); -- 10x12end;1314-- for s krokem desetinnym15for i=1,10,0.5 do16 print("i je mensi nez 10"); -- 20x17end;1819-- for s krokem zapornym20for i=10,1,-1 do21 print("i je mensi nez 10"); -- 10x22end;
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-- tabulka2local tabulka = {"1","8","6","5","2"};34-- genericky for pouzivajici jako iterator ipairs5for klic,hodnota in ipairs(tabulka) do6 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 89 -- 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-- tabulka2local tabulka = {"1","8","6","5","2"};34-- genericky for pouzivajici jako iterator pairs5print("indexy tabulky:")6for klic in pairs(tabulka) do7 print(klic);8end;9-- vysledkem bude neco jako:10-- indexy tabulky:11-- 112-- 213-- 314-- 415-- 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.