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.