Un itérateur est une construction qui permet de répéter (itérer) une même instruction sur les différents éléments d'un ensemble d'articles.
Dans Lua, les itérateurs sont généralement représentés par des fonctions:
Chaque fois que vous appellerez cette fonction itératrice, elle retournera l'élément suivant d'une liste.
Tout itérateur a besoin de garder un état précis, entre les appels successifs, de façon à savoir où il en est et comment procéder à partir de là.
Les "closures" fournissent un excellent mécanisme pour cette tâche.
Rappelez-vous qu'une fermeture ou clôture (en anglais, closure) est une fonction qui accède à une ou plusieurs variables locales de sa fonction englobante.
Ces variables conservent leurs valeurs à travers les appels successifs à la clôture, permettant à celle-ci de se rappeler où elle en est du parcours.
Bien sûr, pour créer une nouvelle clôsure, vous devrez aussi créer ses variables locales externes.
Par conséquent, une telle construction comporte généralement deux fonctions:
- la clôsure elle-même,
- et la fonction qui créer la clôsure.
function Iterateur(t) local i = 0 local nbElements = table.getn(t) return function() i = i + 1 if i <= nbElements then return t[i] end end end
La fonction Iterateur() utilise la fonction Lua table.getn() qui compte le nombre d'éléments de la table (t) et retourne chaque élément de la dite table, t[i].
Contrairement à ipairs, cet itérateur ne retourne pas l'index de chaque élément, mais seulement sa valeur.
Dans cet exemple, la fonction Iterateur(t) est la fabrique qui créer l'itérateur.
Chaque fois que vous l'appelez, elle créer une nouvelle clôture (l'itérateur lui-même).
Cette clôture conserve l'état de ses variables externes (t, i et n) de sorte que, chaque fois que vous l'appellerez, elle retournera la valeur suivante de la liste des t.
Quand il n'y a pas plus de valeur dans la liste, l'itérateur retourne nil.
Vous pouvez aussi utiliser ces itérateurs avec while.
-- Pour exécuter cet exemple, rajouter le code wxWidgets N°1 -- ( et bien sûr, la fonction du dessus! ) t = {10, 20, 30} iter = Iterateur(t) -- création de l'itérateur while true do local element = iter() -- appel de l'itérateur if element == nil then break end Affiche(element) end