1

I tried this example code to see if it actually work

--This example is from Programming in Lua Second Edition
function values (t)
  local i = 0
  
  return function () 
    i = i + 1 
    return t[i] 
  end
  
end
t = {10, 20, 30}
iter = values(t)
while true do
  local element = iter()
  -- calls the iterator
  if element == nil then 
    break 
  end
  
print(element) --> 10, 20, 30
end

I decided to change it a bit, I thought the code will get the same result but I think I was wrong

--This example is from Programming in Lua Second Edition
function values (t)
  local i = 0
  
  return function () 
    i = i + 1 
    return t[i] 
  end
  
end
t = {10, 20, 30}

while true do
  local element = values(t)()
  -- calls the iterator
  if element == nil then 
    break 
  end
  
print(element) --> This will print 10 forever if I don't stop the IDE
end

Why is iter important that much?

BlaztOne
  • 180
  • 1
  • 10

1 Answers1

0

When you do local element = values(t)(), you are actually creating an iterator function every single time your loop is running. Take a note of your values function, see that it has a local variable called i. Every single time you are running this function, a local variable is initialized and sent to your inner function which handles the iteration. The original example is perfectly fine, however if you want to practice local and global variables, you may change the local i to a global variable i, or a different name and move it outside your function so it will not get called every time you run your iterate function (You may keep it local still, so the scope will be limited to current file). However, that is totally not recommended, since your value may be re-used some time later by another function or file, also it will limit you to one full iteration per run (Unless you set the value back to zero before retrying to iterate.)

local i = 0 -- Notice that the variable is taken out of the function.
-- With your example, the problem was that this variable was set to 0 for every
-- time you called the function.

function values (t)
  return function () 
    i = i + 1 
    return t[i] 
  end
  
end
t = {10, 20, 30}

while true do
  local element = values(t)()
  -- calls the iterator
  if element == nil then 
    break 
  end
  
print(element) --> This will print 10 forever if I don't stop the IDE
end

Also keep performance in your mind, as every time you are iterating with your example, a function is being created, called, and then destroyed by the garbage collection. This is why the original example created an iterator function only once, and then called it multiple times, whereas your example creates an iterator function every time it is looping.

If all you need to do is to iterate through elements of a table, then lua already has generic for loop (pairs), check here and here. Example in your case (which also shortens your code by a lot):

local t = {10, 20, 30}

-- We don't need key in this case, but if you do, replace _ with k or
-- any other variable name you want.
for _, element in pairs(t) do
    print(element)
end
Ali Deym
  • 142
  • 8