我正在尝试创建一个带有成员函数的简单类,它会打印出一些成员值,但是当我尝试引用'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中创建Test对象并完成回调函数。回调在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
,回调本身就可以正常工作。只有当我尝试这样做时才会出现错误。
答案 0 :(得分:1)
我拿了你的代码,补充道:
local test = Test:new()
test:printName()
它给了我正确的输出。
My name is Test Object
如果您通过C API调用它,则必须记住手动将self
参数压入堆栈。请记住:
obj:fun() ~ obj.fun(obj)
答案 1 :(得分:1)
我设法解决了这个问题。我在监听器构造函数中添加了self
作为额外参数,并将其作为第一个参数传递给回调函数。
-- in the script
self.Callback = LuaCallback(self, self.printName)
Helper.setCallback(self.Callback)