Lua offre un piccolo e tradizionale insieme di strutture di controllo, con se per condizionale e mentre, ripetere, e per per l'iterazione. Tutte le strutture di controllo hanno un terminatore esplicito: fine termina il caso, per e mentre strutture; e fino a quando termina la ripetizione struttura.

La condizione espressione di una struttura di controllo può causare alcun valore. Lua tratta come veri tutti i valori diversi da falso e nullo.


Utilizzo di if ed else

Un se dichiarazione mette alla prova la sua condizione e la sua esegue allora parte o il suo altro-parte conseguenza. Il resto-parte è opzionale.

se a <0 allora a = 0 end

se un <b allora restituire un fine altro ritorno b

se condotti> maxLines poi
showpage ()
linea = 0
end

Quando si scrive nidificate se s, è possibile utilizzare elseif. È simile a un altro seguito da un se, ma evita la necessità di più fine s:

se op == "+", quindi
r = a + b
elseif op == "-" allora
r = a - b
elseif op == "*" allora
r = a * b
elseif op == "/" poi
r = a / b
altro
errore ("operazione non valida")
fine


Utilizzo di While:

Come al solito, Lua prima verifica la mentre condizioni; se la condizione è falsa, allora il ciclo termina; altrimenti, Lua esegue il corpo del ciclo e ripete il processo.

i locali = 1
mentre a [i] fare
stampa (a [i])
i = i + 1
fine

Repeat

Come suggerisce il nome, una ripetizione - fino dichiarazione ribadisce il suo corpo fino a quando la sua condizione è vera. Il test viene effettuato dopo il corpo, in modo che il corpo è sempre eseguito almeno una volta.

- Stampare la prima riga non vuota
ripetizione
line = os.read ()
fino a quando la linea ~ = ""
print (linea)



Il per dichiarazione ha due varianti: la numerica per e generici per.

Un numerica per ha la seguente sintassi:

per var = exp1, exp2, EXP3 do
qualcosa
fine
Questo ciclo eseguirà qualcosa per ogni valore di var da exp1 a exp2, utilizzando EXP3 come il passo per incrementare var. Questa terza espressione è facoltativa; in caso di assenza, Lua si assume come valore di passo. Come esempi tipici di tali cicli, abbiamo
per i = 1, f (x) fare di stampa (i) finale

per i = 10,1, -1 fare stampare (i) finale
Il per ciclo ha alcune sottigliezze che si dovrebbe imparare, al fine di fare buon uso di esso. In primo luogo, tutte tre espressioni vengono valutate una volta, prima del ciclo inizia. Per esempio, nel primo esempio, f (x) viene chiamato solo una volta. In secondo luogo, la variabile di controllo è una variabile locale dichiarata automaticamente dal per istruzione ed è visibile solo all'interno del ciclo. Un errore tipico è di assumere che la variabile esiste ancora dopo il ciclo termina:

per i = 1,10 do stampa (i) finale
max = i - probabilmente sbagliato! `i 'ecco globale
Se avete bisogno di il valore della variabile di controllo dopo il ciclo (di solito quando si interrompe il ciclo), è necessario salvare il valore in un'altra variabile:
- Trovare un valore in un elenco
locale trovato = nil
per i = 1, un do
se un valore di [i] == poi
trovato = i - Memorizzare il valore di `i '
interruzione
fine
fine
stampa (trovati)
In terzo luogo, non si dovrebbe mai modificare il valore della variabile di controllo: Gli effetti di tali cambiamenti è imprevedibile. Se si vuole spezzare una per il ciclo prima della sua risoluzione normale, utilizzare pausa.


Numeric for

Il per dichiarazione ha due varianti: la numerica per e generici per.

Un numerica per ha la seguente sintassi:

per var = exp1, exp2, EXP3 fare
qualcosa
fine
Questo ciclo eseguirà qualcosa per ogni valore di var da exp1 a exp2, utilizzando EXP3 come il passo per incrementare var. Questa terza espressione è facoltativa; in caso di assenza, Lua si assume come valore di passo. Come esempi tipici di tali cicli, abbiamo
per i = 1, f (x) do di stampa (i) finale

per i = 10,1, -1 fare stampare (i) finale
Il per ciclo ha alcune sottigliezze che si dovrebbe imparare, al fine di fare buon uso di esso. In primo luogo, tutte tre espressioni vengono valutate una volta, prima del ciclo inizia. Per esempio, nel primo esempio, f (x) viene chiamato solo una volta. In secondo luogo, la variabile di controllo è una variabile locale dichiarata automaticamente dal per istruzione ed è visibile solo all'interno del ciclo. Un errore tipico è di assumere che la variabile esiste ancora dopo il ciclo termina:

per i = 1,10 do stampa (i) finale
max = i - probabilmente sbagliato! `i 'ecco globale
Se avete bisogno di il valore della variabile di controllo dopo il ciclo (di solito quando si interrompe il ciclo), è necessario salvare il valore in un'altra variabile:
- Trovare un valore in un elenco
trovato locale = nil
per i = 1, un fare
se un valore [i] == poi
trovato = i - Memorizzare il valore di 'io'
rompere
fine
fine
stampa (trovati)
In terzo luogo, non si dovrebbe mai modificare il valore della variabile di controllo: Gli effetti di tali cambiamenti è imprevedibile. Se si vuole spezzare una per il ciclo prima della sua risoluzione normale, utilizzare pausa.


Generic for

Il generico per ciclo consente di attraversare tutti i valori restituiti da una funzione di iteratore. Abbiamo già visto esempi del generico per:

- Stampare tutti i valori di matrice `a
'per i, v in ipairs (a) fare di stampa (v) fine
Per ogni passo in quel codice, io ottiene un indice, mentre v ottiene il valore associato a tale indice. Un esempio simile mostra come attraversiamo tutti i tasti di una tabella:
- Stampare tutte le chiavi della tabella `t
'per k in coppia (t) fare di stampa (k) fine
Nonostante la sua apparente semplicità, il generico per è potente. Con iteratori propri, siamo in grado di attraversare quasi tutto, e farlo in modo leggibile. Le librerie standard offrono diversi iteratori, che ci permettono di iterare le linee di un file (io.lines), le coppie in una tabella (coppie), le parole di una stringa (string.gfind, che vedremo nel capitolo 20 ), Eccetera. Naturalmente, possiamo scrivere le nostre iteratori. Sebbene l'uso del generico per è facile, il compito di scrivere funzioni iteratori ha le sue sottigliezze. Tratteremo questo argomento più tardi, nel capitolo 7.
Le azioni ciclo generici due proprietà con il ciclo numerico: Le variabili di loop sono locali per il corpo del ciclo e non si dovrebbe mai assegnare qualsiasi valore alle variabili di loop.

Vediamo un esempio più concreto dell'uso di un generico per. Supponiamo di avere una tabella con i nomi dei giorni della settimana:

giorni = {"Domenica", "Lunedi", "Martedì", "Mercoledì",
"Giovedi", "Venerdì", "Sabato"}

Ora si desidera tradurre un nome nella sua posizione nella settimana. È possibile cercare il tavolo, cercando il nome dato. Spesso, tuttavia, un approccio più efficiente in Lua è quello di costruire una tabella di inversione, dire revDays, che ha i nomi come indici e numeri come valori. Quel tavolo sarebbe simile a questa:

revDays = {["della domenica"] = 1, ["Lunedi"] = 2,
["Martedì"] = 3, ["mercoledì"] = 4,
["giovedì"] = 5, ["Venerdì"] = 6 ,
["Sabato"] = 7}
Quindi, tutto quello che dovete fare per trovare l'ordine di un nome è quello di indice di questa tabella inverso:
x = "Tuesday"
di stampa (revDays [x]) -> 3
Naturalmente, non abbiamo bisogno di dichiarare manualmente la tabella inverso. Siamo in grado di costruire automaticamente da quello originale:
revDays = {}
per I, V in ipairs (giorni) fanno
revDays [v] = i
finiscono
Il ciclo farà l'assegnazione per ogni elemento di giorni, con la variabile i ottenendo l'indice (1, 2, ) e contro il valore ("Domenica", "Lunedi", ).