Lua — две локальные переменные с одинаковым именем

Я изучаю Lua и мне интересно, можно ли ссылаться на две локальные переменные с одним и тем же именем.

Например, допустим ли синтаксис в следующем фрагменте кода (без неопределенного поведения)?

Я спрашиваю, потому что он работает, но я не могу понять, что происходит за кулисами. Это просто ссылка на тот же x локальный? Или теперь есть две переменные local x, которые за кулисами все портят. Я хотел бы знать, что именно здесь происходит и почему это так.

local x = 5 + 3; -- = 8
local x = 3 - 2; -- = 1

print("x = " .. x); -- x = 1

person MrHappyAsthma    schedule 06.06.2013    source источник


Ответы (3)


Есть две переменные. Второй затеняет (но не удаляет и не перезаписывает) первый.

Иногда вы все еще можете получить доступ к более раннему определению через замыкание.

local x = 5 + 3
local function getX1()
  return x
end
local x = 3 - 2
local function getX2()
  return x
end

print("x = " .. x); -- x = 1
print("x = " .. getX1()); -- x = 8
print("x = " .. getX2()); -- x = 1
person finnw    schedule 06.06.2013

Все ваши локальные переменные были запомнены Lua :-)

local x = 5 + 3; -- = 8
local x = 3 - 2; -- = 1

local i = 0
repeat
   i = i + 1
   local name, value = debug.getlocal(1, i)
   if name == 'x' then
      print(name..' = '..value)
   end
until not name
person Egor Skriptunoff    schedule 06.06.2013

Да, это законно. Lua обрабатывает объявления local переменных как statements.

Вот интересный пример из справочного руководства по Lua:

Обратите внимание, что при каждом выполнении локального оператора определяются новые локальные переменные. Рассмотрим следующий пример:

 a = {}
 local x = 20
 for i=1,10 do
   local y = 0
   a[i] = function () y=y+1; return x+y end
 end

Цикл создает десять замыканий (то есть десять экземпляров анонимной функции). Каждое из этих замыканий использует разные переменные y, но все они используют один и тот же x.

В этом примере, если игнорировать возвращаемую часть замыкания, в одном и том же блоке for будет 10 переменных local с именами y.

person Yu Hao    schedule 06.06.2013