Lua Iteradores: guia completo

Os iteradores Lua permitem iterar sobre estruturas de dados complexas, como tabelas , arrays e até mesmo tipos de dados definidos pelo usuário de maneira limpa, concisa e eficiente.

Os iteradores podem ser usados ​​para simplificar o código, reduzir erros e tornar o código mais legível e fácil de manter.

Os iteradores Lua podem ser classificados como sem estado ou com estado com base em manter ou não qualquer estado interno.

O foco deste artigo serão os iteradores em Lua.



Iteradores de Lua sem Estado

Um iterador sem estado é aquele que não mantém nenhum estado interno e simplesmente retorna o próximo valor na sequência.

Cada chamada para a função iteradora é independente de qualquer chamada anterior.

Aqui está um exemplo de um iterador sem estado:

Example: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function values(t)
local i = 0
return function()
i = i + 1
return t[i]
end
end
t = {2, 4, 6, 8, 10}
for v in values(t) do
print(v)
end
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Alguns iteradores sem estado integrados são:

ipairs()

Esta função itera sobre arrays com chaves inteiras em ordem numérica.

Uma matriz é passada para a função como um argumento e ela retorna uma função iteradora que pode ser usada para percorrer os elementos da matriz.

O exemplo abaixo é usado para demonstrar a função ipairs onde a tabela é passada como argumento:

Example: 

1
2
3
4
5
6
7
8
local arr = {"one", "two", "three"}
for i, fruit in ipairs(arr) do
print(i, fruit)
end
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

pares()

Esta função é usada para iterar sobre tabelas.

Ele retorna uma função iteradora que itera sobre os pares chave-valor em uma tabela.

O exemplo a seguir trata da função pairs em Lua que recebe a tabela como argumento:

Example: 

1
2
3
4
5
6
7
8
9
local arr = {"one", "two", "three"}
-- Iterate over the key-value pairs in the table
for key, value in pairs(arr) do
print(key .. " – " .. value)
end
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

próximo()

Ele permite iterar sobre uma tabela.

Ele recebe dois argumentos: uma tabela e uma chave, e retorna o próximo par chave-valor na tabela seguinte à chave fornecida.

Se a chave fornecida for nula, next() retorna o primeiro par chave-valor da tabela.

Vamos explorar esta função usando como exemplo:

Example: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
t = {one = 1, two = 2, three = 3}
-- using next() with nil as the key returns the first key-value pair
k, v = next(t, nil)
print(k, v) -- prints "one 1"
-- using next() with the first key returns the second key-value pair
k, v = next(t, k)
print(k, v) -- prints "two 2"
-- using next() repeatedly returns each subsequent key-value pair
k, v = next(t, k)
print(k, v) -- prints "three 3"
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

string.gmatch()

A função string.gmatch() em Lua recebe uma string e um padrão como entrada e retorna uma função iteradora que pode ser usada para iterar todas as correspondências do padrão na string especificada.

A função do iterador gera cada correspondência em tempo real, com base na string de entrada e no padrão fornecido a ela.

O exemplo a seguir ilustra a função string.gmatch em Lua:

Example: 

1
2
3
4
5
6
7
8
9
10
11
local str = "MrExamples"
local pattern = "%a+"
local iterator = string.gmatch(str, pattern)
for match in iterator do
print(match)
end
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Iteradores Lua Stateful

O iterador com estado Lua é aquele que mantém algum estado interno entre as chamadas para a função do iterador.

O estado pode ser usado para rastrear onde o iterador está na sequência ou para executar alguma outra função.

Vamos dar uma olhada em um exemplo de iterador com estado:

Example: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function range(start, stop, step)
local i = startstep
return function ()
i = i + step
if step > 0 and i > stop then
return nil
elseif step < 0 and i < stop then
return nil
else
return i
end
end
end
for x in range(1, 10, 2) do
print(x)
end
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Alguns iteradores com estado integrados são:

coroutine.wrap()

Ele cria uma função iteradora que pode ser retomada com a função coroutine.resume().

Nenhum argumento é necessário para a função do iterador e vários valores são retornados pela co-rotina.

Assim que a função co-rotina retornar, a função iteradora também retornará, indicando que a iteração foi concluída.

Os exemplos a seguir mostram a implementação da função coroutine.wrap() :

Example: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function even_numbers(limit)
local i = 0
return coroutine.wrap(function()
while i < limit do
i = i + 2
coroutine.yield(i)
end
end)
end
for n in even_numbers(10) do
print(n)
end
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

io.lines()

Esta função retorna um iterador para iterar nas linhas de um arquivo.

Ele usa um nome de arquivo ou um identificador de arquivo aberto como argumento e retorna um iterador que pode ser usado para percorrer as linhas do arquivo.

O trecho de código a seguir retrata a função io.lines() em Lua:

local file = io.open("my_file.txt", "r")

for line in io.lines(file) do
print(line)
end

io.close(file)

No exemplo acima, abrimos um arquivo local chamado my_file.txt  para leitura e usamos a função io.lines() para percorrer as linhas do arquivo.

Cada linha é retornada como uma string e impressa no console .

Por fim, fechamos o identificador de arquivo usando a função io.close() .

Para manter-se atualizado com todos os avanços mais recentes em Lua, assine nosso boletim informativo abaixo.

Nós valorizamos o seu feedback.
+1
0
+1
0
+1
0
+1
0
+1
0
+1
0
+1
0

Assine a nossa newsletter
Digite seu e-mail para receber um resumo semanal de nossos melhores posts. Saber mais!
ícone