Lua - Iterator Closures
Iterator
Iterator is a construct which can be used to traverse a collection. In Lua, iterators are functions and we can customize them easily as per our need. Consider the following use cases−
Generate a list of squared numbers starting from 1 upto n2.
Generate a list of n even numbers.
Generate a list of n odd numbers.
In above use cases, we're required to write infinite iterators which when invoked always return a new number as per the given use case.
Example - To get Iterator of Square numbers
Let's create a simple iterator which takes state and a control variable. state will define the maximum number of elements to be produced and control variable will return the position of element.
Iterator Function
-- iterator function to get squared number
function square(n,i)
if i < n
then
i = i+1
return i,i*i
end
end
Using for loop
In for loop, we'll use the iterator while passing the state n as 5 and control i as 0
-- run the for loop for index, element in square,5,0 do -- print the element print(index, element) end
Complete Example of For Loop using Iterator for squared numbers
Following is the complete code of running a for loop on a iterator to get required squared numbers.
main.lua
-- iterator function to get next squared number
function square(n,i)
if i < n
then
i = i+1
return i,i*i
end
end
-- run the for loop
for index, element in square,5,0
do
-- print the element
print(index, element)
end
Output
When we run the above code, we will get the following output −
1 1 2 4 3 9 4 16 5 25
Example - Iterator for even numbers
Following is the complete code of running a for loop on a iterator to get required even numbers.
main.lua
-- iterator function to get next even number
function even(n,i)
if i < n
then
i = i+1
return i,i*2
end
end
-- run the for loop
for index, element in even,5,0
do
-- print the element
print(index, element)
end
Output
When we run the above code, we will get the following output −
1 2 2 4 3 6 4 8 5 10
Example - Iterator for odd numbers
Following is the complete code of running a for loop on a iterator to get required odd numbers.
main.lua
-- iterator function to get next odd number
function odd(n,i)
if i < n
then
i = i+1
return i, i*2 - 1
end
end
-- run the for loop
for index, element in even,5,0
do
-- print the element
print(index, element)
end
Output
When we run the above code, we will get the following output −
1 1 2 3 3 5 4 7 5 9