【发布时间】:2013-12-04 18:30:23
【问题描述】:
我有一个 c++ 主机,我在其中使用 tolua++ 向 Lua 公开一些类。其中一个类有一个函数,应该从 lua 注册回调。所以当 C++ 代码需要调用一个 Lua 注册的函数时它可以。然而,该函数是一个表/类函数。我以前用字符串函数名(不是lua“类”的一部分)成功地做到了这一点,但我很好奇我是否能够以某种方式存储Lua函数而不是函数名。
我将我的 lua 类定义为:
MyClass = {}
function MyClass:Create()
local obj = {}
-- copy all functions from MyClass table to this local obj and return it
local k,v
for k,v in pairs(obj) do
obj[k] = v
end
return obj
end
function MyClass:Enter()
self.CPlusClass = CPlusClass:Create() -- this is the C++ class creation, I defined a static function Create()
self.CPlusClass:RegisterCallback(15, self.Callback) -- this is where I want to pass this instances function to be called back from the C++ class
end
function MyClass:Callback(reader)
-- I want to be able to use self here as well so it needs to be the same instance
end
在 MyClass:Enter() 内部是我想注册 lua“类”函数 MyClass::Callback 以便能够从 C++ 对象调用的地方。我如何将它传递给 C++ 函数?什么样的类型才能从 C++ 调用 MyClass:Callback() 并传入“self”,这样它就是类的同一个“实例”?
所以我知道'self'指的是我创建的一个实际变量,我假设它将按变量名在全局表中,但是当你在 lua“类”中时,我怎么知道变量名'self '也是指?如果我能得到它,我可以将它传递给我的 C++ 函数并将其存储为字符串,以便我可以在其上调用 getglobal 以获取该特定表,然后我还可以将表函数名称作为字符串传递,并且在 C++ 中我可以也得到它,然后调用它。但问题是,如何将“self”转换为它所指向的实际变量名,以便我可以在 C++ 中调用 getglobal 来获取该表?
【问题讨论】:
-
self不是全局变量,self 是由table:function语法糖定义的自动变量。function table:class(args...) ... end与function table.class(self, args...) ... end相同。同样,对tab:class(args...)的调用与tab.class(tab, args...)相同(尽管选项卡只评估一次)。 -
我明白这一点。然而,self 指的是我在 lua 程序中某处创建的表。我怎么知道 self 指的是什么变量名?
-
您不能将函数与其表“对象”取消关联,并让它稍后再次在该表“对象”上工作。你需要创建一个闭包作为你的回调函数来做你想做的事情。
-
self是变量名。它是函数的第一个参数。它是调用函数的表。 -
但 self 指的是我在 lua 程序某处创建的表,不是吗?该表变量名必须在全局表中不是吗?