Clique sobre os tópicos listados abaixo para navegar até o conteúdo desejado.

  1. Entender iterador e tipos de iteradores
  2. Iterador customizado

Um iterador é um tipo de dado que armazena referências sobre elementos de coleções ou estruturas de dados dinâmicas. Essas coleções podem ser vetores, tables e semelhantes.

Tipos de iteradores:
  1. Stateless
  2. Statefull
  3. Built-in

stateless tipo de iterador não mantém nenhum tipo de estado enquanto itera os elementos de uma coleção. Esse tipo de iterador não possui funções anônimas/lambda sendo executadas/retornada para cada elemento iterado.

Exemplo 1
local col = {"valor1","valor2"}

for i, val in ipairs(col) do 
  print("idx:",ch,"valor:", val)
end
Saída
idx:	1	val:	valor1
idx:	2	val:	valor2

Um iterador stateful, armazena o estado do elemento da coleção devido a função anônima(closure) que usam variáveis locais, quando uma coleção é iterada, e é retornada pelo iterador.

Exemplo 2
col = {"str0", "str1", "str2"}
function iterador(colecao)
   local idx = 0
   return function () --closure
      idx = idx + 1
	  if idx <= #colecao then
        return colecao[idx]
      end
   end
end

for elem in iterador(col) do
   print(elem)
end
Saída
str0
str1
str2

Os iteradores builtin fornecidos pela linguagem lua são: ipairs que é usado iterar coleções que possuem índice e valor associado, e pairs que é usado para iterar coleções com chave-valor.

Exemplo 3: ipairs
local col = {"valor1","valor2"}

for i, val in ipairs(col) do 
  print("idx:",ch,"valor:", val)
end
Saída
idx:	1	val:	valor1
idx:	2	val:	valor2
Exemplo 4: pairs
local col = {}
col[1] = "str1"
col[2] = "str2"

for ch, val in pairs(col) do 
  print("chave:",ch,"valor:", val)
end
Saída
chave:	1	valor:	str1
chave:	2	valor:	str2

Lua permite a criação de iteradores customizados de acordo com as necessidades de nossas coleções. Para criar esse tipo de iterador, precisamos definir 2 funções: uma que filtra ou processa o elemento da coleção baseado em seu valor e índice ou chave, e outra função que retorna os dados desejados para retorno.

Sintaxe: função filtro
function nome_funcao(valor, índice)
Sintaxe: iterador
function nome_funcao(valor)
Onde
valor: valor do elemento
indice: índice do elemento
Exemplo 5
function fdobro(parametro,indice)
   if indice < parametro then --limite/contador
      indice = indice + 1
      return indice, indice*2 --dobro
   end
end

function idobro(valor)
   return fdobro, valor,-1
end
   
for ind, val in idobro(4) do
   print("i:",ind,"v:", val)
end
Saída
i:	0	v:	0
i:	1	v:	2
i:	2	v:	4
i:	3	v:	6
i:	4	v:	8
  1. 12/06/2025 - revisão 3 - Conteúdo reescrito
  2. 12/09/2024 - revisão 2 - Ajustes gramaticais, ajustes nos exemplo 1 e 2
  3. 03/10/2023 - revisão 1 - Correção em referências e erros gramaticais
  4. 26/05/2023 - versão inicial