lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Rici Lake wrote:
The real index name is the last localvar; it is not in scope until the loop
starts. Consequently, for loops correctly (imho) create a new index object
on each loop, which in turn means that upvalues work correctly.

In other words:

  timestable = {}
  for i = 1, 10 do
    timestable[i] = function(j) return i * j end
  end

will do the right thing in lua 5.1, and something quite different
in earlier versions.

Depends on how you interpret the for loop. If you interpret the loop as:

do
  local i = 1
  repeat
    timestable[i] = function(j) return i * j end
    i = i + 1
  until i > 10
end

Then the right thing is the behavior of Lua 5.0.2 (in fact, this is the way for is explained in the reference manual :-) ). You can easily have it the other way by explicitely declaring another local:

timestable = {}
for i = 1, 10 do
  local k = i
  timestable[i] = function(j) return k * j end
end

The new way just makes it more convenient. Well, I'm sure this new way will be documented in the 5.1 reference manual. :-) And the loop variable is not really created anew each iteration; the same register is reused. There is no performance penalty.

--
Fabio Mascarenhas