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

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:

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

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

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