LoriotPro Extended Edition Programmation en language LUA

Table des matières

HelpLUA

Itération avec for


La boucle d'itération for est disponible sous deux formes. Une peut être employé pour réitérer par une progression numérique et l'autre peut être employé pour réitérer des fonctions finies appelées les iterators.

Progression numérique

La version numérique de progression de for a la syntaxe suivante :

for variable = from_expression , to_expression [, step_expression] do instruction end

La boucle d'itération for positionne la valeur variable à from_exp avant d'éxécuter l'intruction. L'intruction est exécutée seulement si la variable n'a pas passé la dernière valeur de to_exp. Ceci inclut la première fois que la boucle est réitérée. Chaque fois que instruction est exécuter step_exp est ajouté à la variable. L'indication de step_exp est facultative. Si on ne l'indique pas la valeur de 1 est employée. Par exemple,

> for i = 1,3 do print(i) end -- count from 1 to 3
1
2
3
> for i = 3,1 do print(i) end -- count from 3 to 1 in steps of 1. zero iterations!
> for i = 3,1,-1 do print(i) end -- count down from 3 to 1
3
2
1
> for i=1,0,-0.25 do print(i) end -- we're not limited to integers
1
0.75
0.5
0.25
0

for i = e1,e2,e3 do end est équivalent au code suivant de Lua :

do
local i, limit, step = tonumber(e1), tonumber(e2), tonumber(e3) or 1
if not (i and limit and step) then error() end
while (step>0 and i<=limit) or (step<=0 and i>=limit) do
-- block code
i = i + step
end
end

Iterations

La deuxième forme de la boucle for a la syntaxe :

for var {, var} in explist do block end

l'explist (liste d'expressions) est évalué avant l'entrée dans la boucle. Les résultats de cette évaluation sont une fonction

iterative (qui place les valeurs de var), un état (d'ou les valeurs peuvent être lues), et une valeur initiale (d'ou part l'itération).

Itération de tables

Si nous mettions une table au lieu d'explist Lua fournira l'explist correct pour nous. Chaque élément dans une table est représenté par une paire de clef et de valeur. Lisez Table pour plus de détails au sujet de l'utilisation des tables. Pourafficher tous les éléments dans une table nous pouvons faire ce qui suit :

t = { 3,7,10,17; banana="yellow", pi=3.14159 }
> for key,value in t do print(key,value) end
1 3
2 7
3 10
4 17
pi 3.14159
banana yellow

Fonction: pairs(table)

Lua fournit une fonction pairs() pour créer l'information d'explist pour itèration d'une table. La fonction pairs()permettra l'itération sur les paires de clef-valeur.

for key,value in pairs(t) do print(key,value) end
1 3
2 7
3 10
4 17
pi 3.14159
banana yellow

Fonction: ipairs(table)

ipairs() La fonction permettra l'itération sur des paires d'index-valeur. Ce sont des paires de clef-valeur où les clefs sont des index dans une rangée du tableau:

> for index,value in ipairs(t) do print(index,value) end
1 3
2 7
3 10
4 17

Remarquez comment seulement la rangée de la table est affiché parce que seulement ces éléments ont des clefs d'index.

Fonction: next()

La fonction next(table [,index]) réalise une itèration sur une table. Avce une table et un index elle renvoie la prochaine paire de clef-valeur de la table, par exemple,

= next(t) -- index will be nil, the beginning
1 3
> = next(t,"pi")
banana yellow

pairs() La fonction renvoie un explist (liste d'expressions) contenant next() ainsi nous pouvons faire une itération sur les tables. Nous pouvons passer notre propre liste d'expression à la condition for comme suit :

> for key,value in next,t,nil do print(key,value) end
1 3
2 7
3 10
4 17
pi 3.14159
banana yellow

Nous passons next,table,nil comme liste d'expression à la condition for . Nous disons ici que nous voulons employer la fonction d'iteration next(), sur la table appelée la "table", commençant à nil (le commencement). La condition for continue à s'exécuter jusqu'à ce que la fonction next() retourne nil (l'extrémité de la table).

Fonction: io.lines()

Lua fournit d'autres iteration utiles, comme io.lines([filename]) dans la bibliothèque io. Nous pouvons démontrer ceci en créant un dossier fait sur commande contenant quelques lignes de texte.

io.output(io.open("my.txt","w"))
> io.write("This is\nsome sample text\nfor Lua.")
> io.close()

Fonction: file:lines()

La bibliothèque io fournit une autre manière de lire les lignes de texte d'un fichier.

> for line in io.lines("my.txt") do print(line) end
This is
some sample text
for Lua.

Fonction: file:lines()

> file = assert(io.open("my.txt", "r"))
> for line in file:lines() do print(line) end
This is
some sample text
for Lua.
> file:close()

Quelles sont les différences avec io.lines()?

Vous devez explicitement ouvrir et fermez le ficheir. Un des avantage est que si le dossier ne peut pas être ouvert, vous pouvez gérer cet échec dans le code. Ici, assert a le même effet que io.lines: l'interprèteur LUA s'arrête avec un message d'erreur et pointe sur la ligne défectueuse ; mais vous pouvez tester sur la valeur nil de file et faire autre chose.

Un autre avantage est que vous pouvez commencer la boucle sur n'importe quelle ligne :

file = assert(io.open("list.txt", "r"))
local line = file:read()
if string.sub(line, 1, 1) ~= '#' then
ProcessLine(line) -- File doesn't start with a comment, process the first line
end
-- We could also loop on the first lines, while they are comment
-- Process the remainder of the file
for line in file:lines() do
ProcessLine(line)
end
file:close()

Iterators faits sur commande

Nous pouvons écrire nos propres iterations, similaires à next(), pour réaliser des itérations sur des séquences quelconques de données. Ceci est couvert plus en détail dans Iterations.



LUTEUS www.loriotpro.com