Latest web development tutorials

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.