我正在尝试创建一个带有成员函数的简单类,该函数将打印出一些成员值,但是当我尝试引用"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
但我得到类似的错误。我在这里做错了什么?
编辑:
忘了提到我从C++代码调用printName()
函数。如果我从 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)