无法获得Lua函数来引用'self'

时间:2014-12-03 09:15:43

标签: c++ lua lua-5.2 luabridge

我正在尝试创建一个带有成员函数的简单类,它会打印出一些成员值,但是当我尝试引用'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,回调本身就可以正常工作。只有当我尝试这样做时才会出现错误。

2 个答案:

答案 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)
相关问题