是的,可以向现有的导出类添加新方法。
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
将是该对象。因此,向method3
Foobar 表添加一个新方法将允许您执行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()