Lua iterator
Iterator (iterator) est un objet qui peut être utilisé pour traverser la Standard Template Library contenant tout ou partie des éléments, l'adresse de chaque objet itérateur représente un récipient déterminé
Dans Lua iterator est un type de structure de support de pointeur, qui peut traverser chaque élément de la collection.
Generics pour iterator
Generics pour la conservation dans sa propre fonction itérative interne, en fait, il enregistre trois valeurs: une fonction itérative, les constantes de l'état, les variables de contrôle.
Generics pour l'itération fournit un ensemble de paires clé / valeur, la syntaxe est la suivante:
for k, v in pairs(t) do print(k, v) end
Le code ci-dessus, k, v liste de variables, paire (t) pour la liste des expressions.
Voir les exemples suivants:
array = {"Lua", "Tutorial"} for key,value in ipairs(array) do print(key, value) end
La sortie est le code ci-dessus est exécuté:
1 Lua 2 Tutorial
Les exemples ci-dessus nous avons utilisé les ipairs de fonctions itératives Lua fourni par défaut.
Nous examinons ici le processus pour l'exécution de Fan:
- Tout d'abord, l'initialisation, calculée en valeur après une expression, l'expression doit revenir pour la plage requise de trois valeurs: une fonction itérative, les constantes de l'état, les variables de contrôle, et l'affectation multi-valeur, le nombre de résultats si l'expression renvoie moins de trois avec des points nuls seront automatiquement make up, la partie supplémentaire sera ignorée.
- Deuxièmement, les constantes de l'Etat et variable de contrôle en tant que paramètre pour appeler la fonction iterator (Note: pour la structure, constantes d'état inutile, juste obtenir ses valeurs lorsque initialisé et transmis à la fonction d'itération).
- Troisièmement, la fonction retourne la valeur itération à la liste des variables.
- Quatrièmement, si la valeur de retour de zéro dans la première extrémité de la boucle, sinon le corps de la boucle.
- Cinquièmement, l'appel vers la deuxième fonction étape d'itération à nouveau
. Dans Lua nous utilisons souvent pour décrire la fonction itérateur, chaque appel à cette fonction retourne l'élément suivant de la collection. Lua itérateur contient les deux types suivants:
- iterator Stateless
- Multi-état iterator
iterator Stateless
iterator Stateless fait référence ne conserve pas de itérateurs de l'Etat, donc nous pouvons utiliser la boucle iterator apatride éviter de créer des fermetures passent supplément de prix.
Chaque itération, les fonctions d'itération sont deux variables (variables d'état et de contrôle constant) valeur comme paramètre est appelé un iterator apatride en utilisant seulement ces deux valeurs pour obtenir l'élément suivant.
Un exemple typique d'un tel iterator apatride simple ipairs, il à travers chaque élément du tableau.
L'exemple suivant, nous utilisons une fonction simple pour atteindre le iterator, n numérique carré:
function square(iteratorMaxCount,currentNumber) if currentNumber<iteratorMaxCount then currentNumber = currentNumber+1 return currentNumber, currentNumber*currentNumber end end for i,n in square,3,0 do print(i,n) end
L'exemple ci-dessus sortie est:
1 1 2 4 3 9
état traversal itératif comprend une table (au cours du cycle ne change pas l'état constant) et l'indice actuel de l'indice (variables de contrôle), et ipairs fonction itérative est très simple, nous pouvons réaliser dans Lua:
function iter (a, i) i = i + 1 local v = a[i] if v then return i, v end end function ipairs (a) return iter, a, 0 end
Lorsque Lua appelle ipairs (a) pour démarrer le cycle, il a acquis trois valeurs: un iter itérative de fonction, un état constant, la commande valeur initiale variable de 0, puis Lua iter (a, 0) renvoie 1, appelle un [1] (à moins qu'un [1] = zéro), la seconde itération iter (a, 1) retourne 2, appelle [2], ...... jusqu'à ce que le premier élément nul.
Multi-état iterator
Dans de nombreux cas, la nécessité de préserver la pluralité des informations d'état de iterator plutôt que d'indiquer simplement les constantes de contrôle et de variables, le plus simple est d'utiliser des fermetures, il existe un moyen d'encapsuler toutes les informations d'état dans une table, la table comme un processus itératif l'état des constantes, parce que dans ce cas, toutes les informations peuvent être stockées dans la table, la fonction de manière itérative ne sont généralement pas besoin du second paramètre.
L'exemple suivant, nous avons créé nos propres itérateurs:
array = {"Lua", "Tutorial"} function elementIterator (collection) local index = 0 local count = #collection -- 闭包函数 return function () index = index + 1 if index <= count then -- 返回迭代器的当前元素 return collection[index] end end end for element in elementIterator(array) do print(element) end
L'exemple ci-dessus sortie est:
Lua Tutorial
Les exemples ci-dessus, nous pouvons voir, l'utilisation de fermetures au sein de la fonction elementIterator, calculée pour obtenir la taille du jeu et la sortie de chaque élément.