Это вопрос о замыканиях в Луа.Я наткнулся на проблему (и обходной путь) при попытке сделать объект регистратора объектов следующим образом:
tracker = {
objList = {},
myRegister = function(self, obj)
table.insert(self.objList, obj)
return "hello"
end,
myInit = function(self)
local i, obj
for i, obj in ipairs(self.objList) do
obj:init()
end
end,
}
-- Note: As written, this does *not* work.
-- It *will* work if I separate the line into two parts as follows:
-- local myvar
-- myvar = tracker:myRegister({
local myvar = tracker:myRegister({
init = function(self)
-- This will generate an error complaining that myvar
-- is a global variable with a "nil" value
print("myvar = " .. myvar)
end,
})
tracker:myInit()
Кажется, что если я объявлю локальную переменную "myvar" в том же операторе, который создаетзамыкание, то локальная переменная не доступна из замыкания.Однако если я просто присваиваю уже существующую локальную переменную, то эта переменная доступна из замыкания.
Очевидно, я знаю, как это исправить: просто объявите myvar отдельно.
Мой вопрос, однако, заключается в следующем: зачем это нужно?Это от замысла или это ошибка компилятора и / или виртуальной машины?Если это задумано, где это задокументировано?Меня особенно интересует, имеет ли это поведение другие последствия, и каковы они могут быть, и я надеюсь, что документация (опять же, предполагая, что это предполагаемое поведение) позволит пролить некоторый свет на это.