2

我正在使用 tolua++ 将一些 C++ 类导出到 Lua。

我的理解是每个类都是在 lua 端“实现”的,作为一个 lua 表。我想知道是否有可能因此向C++对象表添加新的(Lua)方法,这样我就可以达到向C++类添加新方法的效果。

假设我正在导出类 Foobar。

Foobar 的方法可以在 Lua 中访问,如下所示:

Foobar:method1()
Foobar:method2()
...

等等

我希望能够将新方法(newmethod1 和 newmethod2)添加到 Foobar 表“对象”

我有以下问题:

  1. 是否可以按照我上面描述的方式“扩展”导出的 C++ 对象的功能?
  2. 如何向 Foobar 表添加新功能?(我对 Lua 比较陌生)
4

1 回答 1

3

是的,可以向现有的导出类添加新方法。

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() - 调用 asFoobar:new()创建 Foobar 的实例。
  • delete() - 调用 asinstance:delete()来销毁 Foobar 的一个实例。
  • method1() - 调用 asinstance:method1()在实例上运行 method1。
  • method2() - 调用 asFoobar:method2()来运行 method2。

但是,tolua++ 实际上并没有使用两个不同的表(一个用于应该附加到类本身的方法,一个用于该类实例的方法)。相反,它将两者合并在一起,因此可以运行Foobar:method1()并且instance:new()......即使这不是应该使用这些方法的方式。因此,如何使用静态方法和如何使用实例方法之间没有区别。从语法上讲,它也是一样的。(我个人觉得这是tolua++的问题。)

如果你正在寻找一个例子,下面是你应该如何在 lua 中调用这些函数:

obj = Foobar:new()
print( obj:method1() )
obj:delete()
于 2011-01-10T00:55:09.213 回答