Lua: Le tutoriel  wxWidgets
Lua
Les itérateurs: Les génériques for.

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
				
Cela se lit de la façon suivante:
Pour chaque élément dans la fonction Iterateur(t) faire
Afficher(element)
fin

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
				
La partie principale de la fonction itératrice est l'appel à la fonction Lua string.find.
Cet appel cherche un mot dans la ligne actuelle, à partir de la position actuelle.
Elle décrit un "mot" en utilisant le pattern '%w+', ce qui correspond à un ou plusieurs caractères alphanumériques.
Si elle trouve le mot, la fonction met à jour la position actuelle sur le premier caractère après le mot et retourne ce mot grâce à la fonction Lua string.sub, qui extrait une sous-chaîne de la ligne (line) entre les positions données (s et e).
Sinon (else), l'itérateur lit une nouvelle ligne et répète la recherche.
S'il y a plus de lignes, la fonction d'itération retourne nil pour signaler la fin de la recherche.

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!.

logo wxWidgets Le savoir ne vaut que s'il est partagé par tous...
logo-internet_32x32.png Dernière mise à jour, le 20 novembre 2012.
Valid XHTML 1.0 Transitional

wxlualogo
Flèche haut
Flèche gauche
Flèche haut
Flèche droite