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
Advertisements