Lua iterador
Repetidor (iteradora) é um objecto que pode ser utilizado para atravessar a parte do recipiente de biblioteca de modelos padrão ou de todos os elementos, o endereço de cada objecto iteradora representa um recipiente determinado
Em Lua iterador é um tipo de ponteiro de estrutura de suporte, que pode percorrer cada elemento da coleção.
Genéricos para iterador
Genéricos para a preservação em sua própria função iterativa interna, de fato, ele salva três valores: uma função iterativa, constantes do estado, variáveis de controle.
Genéricos para iteração fornece um conjunto de pares de chave / valor, a sintaxe é a seguinte:
for k, v in pairs(t) do print(k, v) end
O código acima, k, v lista de variáveis; par (t) para a lista de expressões.
Veja os seguintes exemplos:
array = {"Lua", "Tutorial"} for key,value in ipairs(array) do print(key, value) end
A saída é o código acima é executado:
1 Lua 2 Tutorial
Os exemplos acima foram utilizados os ipairs função iterativos Lua fornecidos por padrão.
Aqui olhamos para o processo para a execução do Fan:
- Primeiro, inicialize, calculadas em valor após uma expressão, a expressão deve retornar para o intervalo necessário de três valores: uma função iterativa, constantes do estado, variáveis de controle; e atribuição de vários valores, o número de resultados se a expressão retorna menos de três com pontos nulos irá automaticamente fazer-se, a parte extra será ignorado.
- Em segundo lugar, as constantes de estado e variável de controle como um parâmetro para chamar a função iterator (Nota: para a estrutura, as constantes estaduais inútil, é só pegar os seus valores quando inicializado e passado para a função de iteração).
- Em terceiro lugar, a função retorna o valor iteração para a lista de variáveis.
- Em quarto lugar, se o valor de retorno de zero na primeira extremidade do circuito, de outra forma o corpo do ciclo.
- Em quinto lugar, a chamada para a segunda função etapa iteração novamente
. Em Lua muitas vezes usamos para descrever a função iterator, cada chamada para esta função retorna o próximo elemento da coleção. Lua iterador contém os dois tipos seguintes:
- iterator stateless
- iterator multi-estado
iterator stateless
iterator Stateless refere-se não retém nenhum iterators estaduais, para que possamos usar o iterador apátrida loop de evitar a criação de encerramentos passar preço extra.
Cada iteração, as funções de iteração são duas variáveis (variáveis de estado e controle constante) valor como um parâmetro é chamado de iterador apátrida usando apenas esses dois valores para obter o próximo elemento.
Um exemplo típico de um iterador apátrida tão simples é ipairs, ele através de cada elemento da matriz.
O exemplo a seguir usamos uma função simples de conseguir o iterador, n digitais quadrado:
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
O exemplo acima saída é:
1 1 2 4 3 9
Estado travessia iterativa inclui uma mesa (durante o ciclo não muda o estado constante) eo índice de índice atual (variáveis de controle), ipairs e função iterativa é muito simples, que podemos alcançar na 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
Quando Lua chama ipairs (a) para iniciar o ciclo, adquiriu três valores: um iter iterativa função, um estado constante, o valor inicial variável de controle de 0; em seguida, Lua chama iter (a, 0) retorna 1, a [1] (a menos que um [1] = nil); a segunda iteração chama iter (a, 1) retorna 2, uma [2] ...... até que o primeiro elemento nulo.
iterator multi-estado
Em muitos casos, a necessidade de preservar a pluralidade de informações sobre o estado iterador ao invés de simplesmente declarar constantes de controle e variáveis, a maneira mais fácil é usar encerramentos, há uma maneira para encapsular todas as informações do estado em uma tabela, a tabela como um iterativo o estado das constantes, porque, neste caso, toda a informação pode ser armazenada na tabela, a função de forma iterativa em geral não é necessário o segundo parâmetro.
O exemplo a seguir criamos nossos próprios 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
O exemplo acima saída é:
Lua Tutorial
Os exemplos acima, podemos ver, a utilização de fechos dentro função elementIterator, calculada para alcançar o tamanho do conjunto e de saída de cada elemento.