Latest web development tutorials

iterador Lua

Iterator (iterador) es un objeto que se puede utilizar para atravesar la parte del contenedor biblioteca de plantillas estándar o la totalidad de los elementos, la dirección de cada objeto iterador representa un contenedor determinado

En Lua iterador es un tipo de puntero de estructura de soporte, que puede atravesar cada elemento de la colección.


Los genéricos para iterador

Generics para la preservación en su propia función iterativa interna, de hecho, se ahorra tres valores: una función iterativa, constantes de estado, variables de control.

Los genéricos para la iteración proporciona un conjunto de pares clave / valor, la sintaxis es la siguiente:

for k, v in pairs(t) do
    print(k, v)
end

El código anterior, k, V lista de variables; par (t) para la lista de expresiones.

Véanse los siguientes ejemplos:

array = {"Lua", "Tutorial"}

for key,value in ipairs(array) 
do
   print(key, value)
end

La salida se se ejecuta el código anterior:

1  Lua
2  Tutorial

Los ejemplos anteriores hemos utilizado la función ipairs iterativos Lua proporciona de forma predeterminada.

Aquí nos fijamos en el proceso de la ejecución del ventilador:

  • En primer lugar, inicializar, calculada en valor después de una expresión, la expresión debe devolver el rango requerido de tres valores: una función iterativa, las constantes de estado, variables de control, y la asignación de valores múltiples, el número de resultados si la expresión devuelve menos de tres con puntos nulos harán automáticamente, se tendrá en cuenta la parte adicional.
  • En segundo lugar, las constantes de estado y variable de control como un parámetro para llamar a la función de repetidor (Nota: para la estructura, las constantes estatales inútiles, acaba de obtener sus valores cuando se inicializa y se pasa a la función de iteración).
  • En tercer lugar, la función devuelve el valor de iteración a la lista de variables.
  • En cuarto lugar, si el valor de retorno de cero en el primer extremo del bucle, de lo contrario el cuerpo del bucle.
  • En quinto lugar, la llamada de nuevo a la segunda función de paso de la iteración de nuevo

. En Lua que utilizamos a menudo para describir la función de repetidor, cada llamada a esta función devuelve el siguiente elemento de la colección. Lua iterador contiene los siguientes dos tipos:

  • iterador sin estado
  • iterador de varios estados

iterador sin estado

iterador sin estado se refiere no conserva ningún iteradores estatales, por lo que puede utilizar el iterador sin estado bucle de evitar la creación de cierres pasan precio extra.

Cada iteración, funciones de iteración son dos variables (variables de estado y control constante) valor como un parámetro que se denomina un iterador sin estado utilizando sólo estos dos valores para obtener el siguiente elemento.

Un ejemplo típico de un simple iterador tales sin estado es ipairs, que a través de cada elemento de la matriz.

En el siguiente ejemplo se utiliza una función simple para lograr el iterador, n digitales al cuadrado:

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

La salida del ejemplo anterior es:

1	1
2	4
3	9

Estado de recorrido iterativo incluye una tabla (durante el ciclo no cambia el estado constante) y el índice de índice actual (variables de control), y la función ipairs iterativo es muy simple, podemos lograr en 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

Cuando Lua llama ipairs (a) para iniciar el ciclo, adquirió tres valores: un iter iterativo función, un estado constante, el valor inicial de la variable de control de 0; entonces Lua llama iter (a, 0) devuelve 1, un [1] (a menos que una [1] = nil); la segunda iteración iter llama (a, 1) devuelve 2, un [2] ...... hasta que el primer elemento nulo.


iterador de varios estados

En muchos casos, la necesidad de preservar la pluralidad de la información de estado de iterador en lugar de simplemente indicar constantes de control y variables, la manera más sencilla es utilizar dispositivos de cierre, hay una forma de encapsular la información de estado en una tabla, la tabla como un iterativo el estado de las constantes, ya que en este caso toda la información se puede almacenar en la tabla, por lo que la función iterativa por lo general no es necesario el segundo parámetro.

El siguiente ejemplo hemos creado nuestros propios iteradores:

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

La salida del ejemplo anterior es:

Lua
Tutorial

Los ejemplos anteriores se puede ver, el uso de cierres dentro de la función elementIterator, calculada para alcanzar el tamaño del conjunto y la salida de cada elemento.