Iterators
Iterators provide a way to traverse data. Iterators will usually use a closure to keep track of what data it's on and uses that to determine what to give next.
Take the iterator ipairs for example, it traverses a table in sequence. Its implementation can be written like this:
1
function ipairs(t)
2
local index = 0
3
return function()
4
index = index + 1
5
if t[index] then -- check if the value exists
6
return index, t[index] -- key, value
7
end
8
return nil
9
end
10
end
11
​
12
local t = {1, 2, 3}
13
for k, v in ipairs(t) do
14
print(k, v)
15
end
Copied!
1
Output:
2
1 1
3
2 2
4
3 3
Copied!
Using closures, you can define your own way to iterate through a set of data. You could iterate half of it forward and half of it backwards, iterate the entire thing in reverse, iterate every 2 values, etc.
Here's what a reverse ipairs would look like:
1
function revipairs(t)
2
local index = #t + 1 -- start at the last index in the table, +1 to make sure it hits the end value when index-1 happens
3
return function()
4
index = index - 1 -- travel backwards from the end
5
if t[index] then -- again, checking if the value exists
6
return index, t[index]
7
end
8
return nil
9
end
10
end
11
​
12
local t = {1, 2, 3}
13
for k, v in revipairs(t) do
14
print(k, v)
15
end
Copied!
1
Output:
2
3 3
3
2 2
4
1 1
Copied!
Last modified 2yr ago
Copy link