Невозможно получить функцию Lua для ссылки на себя

Я пытаюсь создать простой класс с функцией-членом, который бы выводил значения некоторых членов, но я получаю ошибки, когда пытаюсь сослаться на "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, Ошибка появляется только тогда, когда я пытаюсь это сделать.

2 ответа

Решение

Мне удалось решить проблему. Я добавил self в качестве дополнительного аргумента в конструкторе слушателя и передал его в качестве первого параметра в функцию обратного вызова.

-- in the script
self.Callback = LuaCallback(self, self.printName)
Helper.setCallback(self.Callback)

Я взял твой код, добавил:

local test = Test:new()
test:printName()

Это дает мне правильный вывод.

My name is Test Object

Если вы вызываете его через C API, вы должны помнить, чтобы вручную нажать self аргумент в стеке. Помните, что:

obj:fun() ~ obj.fun(obj)
Другие вопросы по тегам