A Lua blokkstruktúrált nyelv. A blokk nem más, mint utasítások sorozata. Az utasítások száma tetszőleges, üres utasítást a nyelv nem tartalmaz. Egy blokkot explicit módon kijelölhetünk:
Egy ilyen módon kijelölt blokk önálló utasításként működik. Az explicit blokk-kijelölés a változódeklarációk hatókörének megadására használható. A blokkok végrehajtási sorrendjét vezérlési szerkezetekkel befolyásolhatjuk. A blokkokat felépítő alapvető utasítások és a vezérlő szerkezetek a következőek:
A nyelv lehetőséget ad többszörös értékadásra. Formája a következő:
A bal oldalon változók, a jobb oldalon pedig kifejezések vannak. A két oldalon az argumentumok száma különbözhet. Ilyenkor a következő szabályok érvényesek:
nil
értéket
kap.A többszörös értékadások szimultán módon hajtódnak végre. A következő kód például
beállítja a[3]
értékét 20
-ra, anélkül, hogy megváltoztatná
a[4]
értékét:
Ennek oka, hogy először az értékadás jobb oldala értékelődik ki, és csak ezután
hajtjuk végre magát az értékadást. A következő utasítás tehát megcseréli az x
és y
változók értékét:
Szekvenciák esetén nincs szükség explicit elválasztásra: két utasítást egy szóköz vagy egy újsor karakter is elválaszthat, de használható a más nyelvekben általában megszokott pontosvessző is erre a célra. Mivel üres utasítás nincs a Luában, ezért ezt nem tartalmazhat egy szekvencia.
A Luában csak kétirányú elágazásra van lehetőség, melynek formája a szokásos terminológiát követi:
Egymásba ágyazott elágazásoknál az else
ág hovatartozásának
kérdését az end
utasítások alapján lehet eldönteni. Ugyancsak
egymásba ágyazott elágazásoknál lehet hasznos, hogy nem kell kitenni a befejező
end
-et, hanem használható az elseif
utasítás is:
Ezzel az utasítással a többirányú elágazásokhoz hasonló konstrukció hozható létre, ugyanis a nyelv case-utasítást nem tartalmaz, de vigyázat: ez szemantikailag csak egymásba ágyazott elágazásoknak felel meg!
Elöltesztelős ciklust a következő formában írhatunk:
A ciklus magja itt a kifejezés igaz értéke esetén fut le.
A hátultesztelős ciklus szintaxisa:
A hátultesztelős ciklus a feltétel igaz értéke esetén áll le.
A repeat-until ciklus azonban a Luában igazából csak szintaktikus cukor, és illik vele vigyázni. Egészen addig az elvárásainknak megfelelően fut, amíg nem írunk mondjuk egy ilyen kódot:
A fenti ciklustól azt várnánk, hogy a ciklusmag egyszer fut le, majd mivel a globális
x
változó értéke 0
, kilép. Ezzel szemben a futtatás
eredménye egy végtelen ciklus lesz. Ennek oka az, hogy a ciklusfeltétel a ciklusmag
hatókörében értékelődik ki, vagyis a ciklusunk igazából így fut:
Hátultesztelős ciklus használatakor így mindig figyelnünk kell, hogy ne fedjük el lokális deklarációkkal a ciklusfeltételben szereplő változókat, különben meglepő eredményeket kaphatunk.
Itt kétféle for
ciklus áll rendelkezésünkre: numerikus és általános.
A numerikus for
ciklus formája:
A változó értéke kif1 és kif2 határok között megy végig. A kif3 opcionális, ez adja meg a lépésközt. Alapértelmezett értéke 1. A kifejezések kiértékelése egyszer történik meg, a ciklusmag végrehajtása előtt. A változó automatikusan jön létre a ciklus kezdetekor és csak a cikluson belül látható, ott viszont értéke (sajnos) megváltoztatható. A ciklusváltozó értékének megváltoztatását a Lua tervezői sem ajánlják, a ciklus viselkedése ilyenkor nem definiált.
Luában a következő ekvivalens az előző ciklussal:
Az általános for
ciklus formája:
Itt az iterátor egy függvény, a fix és a kezdő
tetszőleges kifejezés (akár el is hagyhatóak, ekkor a nil
értéket használja
helyettük a nyelv). Ez a ciklus a következőképpen működik. Az elején a
változó felveszi a kezdő értékét. Ezután minden lépés
előtt (tehát már az előbb leírt kezdő értékadás után is) a következő
értékadás fut le:
Ha az eredményként kapott érték nil
, akkor véget ér a ciklus,
különben lefut a blokk, és újra jön az iterátorhívás. A változó
értékének megváltoztatása itt is definiálatlan viselkedést eredményez. Több
változót is meg lehet adni a fejlécben. Ez akkor hasznos, ha az iterátor több
eredményt ad vissza. Ilyenkor a további változók ezeket az értékeket kapják meg.
Egy tábla elemein való iterációra több standard függvényt is kínál a nyelv.
A tábla egytől kezdődő egész számokkal hézag nélkül indexelt
részén - tehát pl. 0,1,2,3,5 indexek esetén az 1,2,3 indexű elemeken -
iterálhatunk végig az ipairs
függvény segítségével:
A tábla összes elemén való iterálásra használható ennek párja, a pairs
függvény. Ez az összes kulcs-érték páron fut végig:
A pairs
(és előtte az ipairs
) függvény egy iterátor
függvényt és magát a táblát adja vissza (ez utóbbi lesz a fix paraméter értéke).
A ciklus így az csinálja, hogy a key
és value
változók sorban
felveszik a tábla minden kulcs-érték párját, és minden érték mellett lefut egyszer
a blokk. A bejárási sorrend nem determinisztikus.
A ciklusokból való kilépésre használható a break
utasítás,
folytatásra azonban nincs lehetőség (nincs continue lehetőség a nyelvben).
A break
csak egy blokk utolsó utasításaként szerepelhet.
Függvényből való visszatérésre szolgál a return
utasítás. A
break
-hez hasonlóan csak blokk utolsó utasítása lehet. A függvény
visszatérési értékeit vesszővel elválasztva kell felsorolni az utasítás után,
zárójelek nélkül.
Az 5.2-es Lua verzióban bevezették a feltétel nélküli vezérlésátadásra szolgáló
goto
utasítást. A vezérlés átadásához címkéket definiálhatunk, melyek
a nyelv által szintén utasításokként vannak kezelve.
Egy címke az őt definiáló blokkon belül látható, kivéve, ha egy beágyazott blokkon
belül egy ugyanolyan nevű másik címke elfedi. Ezen kívül beágyazott függvényeken
belülről sem használhatjuk a külső blokkban definiált címkéket. A goto
utasítás bármelyik látható címkére átadhatja a vezérlést, ha ezzel nem lép be egy lokális
változó láthatósági körébe sem. (Azaz nem ugorhatjuk át a címke utáni kódban
használt lokális változók inicializálását.)