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:
- Stateless
- Statefull
- 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