Le générique for s'occupe de tout, à partir d'une boucle d'itération.
for appelle l'usine itératrice, conserve la fonction itératrice interne, appelle l'itérateur à chaque nouvelle itération, et arrête la boucle quand l'itérateur renvoie nil.
Plus tard vous verrez que le générique for fait encore bien plus que ça.
Avec l'exemple précédent, cela donne:
t = {10, 20, 30} for element in Iterateur(t) do Affiche(element) end
Comme exemple plus complexe, vous allez écrire un itérateur afin de parcourir tous les mots d'un fichier quelconque.
Pour faire cette traversée, vous aurez besoin de garder deux valeurs:
- la ligne actuelle...
- et l'endroit où vous êtes dans cette ligne.
Avec ces données, vous pourrez toujours générer le mot suivant.
Pour le conserver, vous utiliserez deux variables locales externes, line et pos.
function TousLesMots() local line = io.read() -- ligne courante local pos = 1 -- position courante dans la ligne return function() -- fonction d'itération while line do -- on répète tant que ligne existe local s, e = string.find(line, "%w+", pos) if s then -- si on trouve un mot? -- position suivante après ce mot pos = e + 1 -- on retourne le mot trouvé return string.sub(line, s, e) else -- mot pas trouvé, on essaie la ligne suivante line = io.read() pos = 1 -- retour à la pos N°1 end end return nil -- plus de ligne = fin de la traversée end end
Malgré son apparente complexité d'écriture, l'utilisation de la fonction TousLesMots() reste simple.
for mot in TousLesMots() do print(mot) end
Cette situation, peut être difficile à écrire, mais facile à utiliser, est commune aux itérateurs.
Mais ce n'est pas un gros problème en soi, car le plus souvent, vous n'aurez pas à définir les itérateurs...
Il existe deux fonctions Lua toutes faites pour ça: pairs et ipairs que vous verrez à la fin de ce chapitre.
Mais il est important de bien comprendre comment tout ça fonctionne... c'est un peu le but de ce tutoriel!.