Я пытаюсь создать простой класс с функцией-членом, который бы выводил значения некоторых членов, но я получаю ошибки, когда пытаюсь сослаться на «self»:
attempt to index global 'self' (a nil value)
Вот скрипт, который я пытаюсь запустить:
Test = {}
function Test:new()
T = {}
setmetatable(T, self)
self.__index = self
self.Name = "Test Object"return T
end
function Test:printName()
print("My name is " .. self.Name) -- This causes the error
end
Я также пытался self:Name
но я получаю похожую ошибку. Что я здесь не так делаю?
РЕДАКТИРОВАТЬ:
Забыл упомянуть, что я называю printName()
функция из кода C ++. Если я вызываю функцию из Lua, она работает правильно.
Тестовый объект создается в Lua и выполняется функция обратного вызова. Обратный вызов вызывается в C ++ следующим образом:
luabridge::LuaRef testObjectRef = ...; // This is populated from Lua, refers to the printName() function
testObjectRef(); // Calls the function
Обратный вызов в скрипте делается так:
-- in Test:new()
self.Callback = LuaCallback(self.printName)
Helper.setCallback(self.Callback)
Сам обратный вызов работает нормально, если я не пытаюсь обратиться к self
, Ошибка появляется только тогда, когда я пытаюсь это сделать.
Я взял твой код, добавил:
local test = Test:new()
test:printName()
Это дает мне правильный вывод.
My name is Test Object
Если вы вызываете его через C API, вы должны помнить, чтобы вручную нажать self
аргумент в стеке. Помните, что:
obj:fun() ~ obj.fun(obj)
Мне удалось решить проблему. Я добавил self
в качестве дополнительного аргумента в конструкторе слушателя и передал его в качестве первого параметра в функцию обратного вызова.
-- in the script
self.Callback = LuaCallback(self, self.printName)
Helper.setCallback(self.Callback)