2

我正在尝试使用可以打印出一些成员值的成员函数创建一个简单的类,但是当我尝试引用“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 中创建 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。只有当我尝试这样做时才会出现错误。

4

2 回答 2

1

我设法解决了这个问题。我self在侦听器构造函数中添加了一个额外的参数,并将它作为第一个参数传递给回调函数。

-- in the script
self.Callback = LuaCallback(self, self.printName)
Helper.setCallback(self.Callback)
于 2014-12-03T09:50:01.570 回答
1

我拿了你的代码,补充说:

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

它给了我正确的输出。

My name is Test Object

如果您通过 C API 调用它,则必须记住手动将self参数推送到堆栈上。请记住:

obj:fun() ~ obj.fun(obj)
于 2014-12-03T09:28:14.387 回答