Latest web development tutorials

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.