2014-12-03 24 views
2

我想创建一个简单的类与成员函数,将打印出一些成员的值,但我收到错误,当我尝试引用'自我':不能得到一个Lua函数来引用'自我'

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调用函数,它可以正常工作。

Test对象在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回调。只有当我尝试这样做时才会出现错误。

+0

'self.Name' * *是正确的语法。让我来运行它。 – 2014-12-03 09:26:41

+0

显示用于从C++调用它的代码。你在栈上推“self”参数吗? (C API没有':'调用的概念!) – 2014-12-03 09:30:42

+0

现在*你忘记说你正在使用luabridge?!!?!*。请再次阅读“关于”部分。我建议使用[** Sol **](https://github.com/Rapptz/sol),而我认为,luabridge在我看来非常棒。 – 2014-12-03 09:33:58

回答

1

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

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

我把你的代码,添加:

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

它给了我正确的输出。

My name is Test Object 

如果您是通过C API调用它,你必须记住要手动推self参数压入堆栈。请记住:

obj:fun() ~ obj.fun(obj) 
+0

这也适用于我,但如果我从C++调用方法,我会得到上述错误。 – manabreak 2014-12-03 09:29:27

+0

@manabreak呃,你为什么不提你从C++调用它?为什么你会忽略这样一个相关的细节? – 2014-12-03 09:30:07

+0

我以前只尝试过从C++调用它,现在我试图从Lua调用它。 – manabreak 2014-12-03 09:30:45

相关问题