是的,可以向现有的导出类添加新方法。
Foobar 只是一个普通的表,因此您可以像在任何其他表上一样附加方法。[1]
Foobar["extra_method"] = function (self, arg1, arg2) print(arg1, arg2) end
现在你可以这样做:
Foobar:extra_method(1,2)
并将1 2显示。
[1] tolua++ 有点奇怪。它为每个类创建一个主表,这就是您所看到的 Foobar,其中包含类的静态成员函数(例如Foobar:new())和类的实例成员函数(例如,Foobar:method1()可能是什么)。lua中的:操作符是语法糖;a:b()被转换为a.b(a)。这意味着当您调用 时Foobar:new(),它被转置为Foobar:new(Foobar),因此self参数是 Foobar 表。当您创建 Foobar 类型的对象,然后在其上调用 method1() 时,self将是该对象。因此,向method3Foobar 表添加一个新方法将允许您执行Foobar:method3() and obj = Foobar:new(); obj:method3(),尽管前者会出错。因此,仅此答案适用于 tolua++。
编辑:解决评论
让我在这里使用实际代码。因此,假设我们有一个 Foobar 的类声明,如下所示:
class Foobar {
public:
void method1();
static void method2();
};
当 tolua++ 为这个类生成 lua 绑定代码时,它会给你一个包含以下方法的表
- new() - 调用 as
Foobar:new()创建 Foobar 的实例。
- delete() - 调用 as
instance:delete()来销毁 Foobar 的一个实例。
- method1() - 调用 as
instance:method1()在实例上运行 method1。
- method2() - 调用 as
Foobar:method2()来运行 method2。
但是,tolua++ 实际上并没有使用两个不同的表(一个用于应该附加到类本身的方法,一个用于该类实例的方法)。相反,它将两者合并在一起,因此可以运行Foobar:method1()并且instance:new()......即使这不是应该使用这些方法的方式。因此,如何使用静态方法和如何使用实例方法之间没有区别。从语法上讲,它也是一样的。(我个人觉得这是tolua++的问题。)
如果你正在寻找一个例子,下面是你应该如何在 lua 中调用这些函数:
obj = Foobar:new()
print( obj:method1() )
obj:delete()