Lua C API:将具有声明方法的对象添加到Lua模块中

参考该问题,假设我们有一个如下结构的Lua C模块:

#include "lauxlib.h"
#include "lua.h"

static int lb_newmatrix(lua_State *L)
{
     (...一些代码...)
     luaL_getmetatable(L,"lb_basic");
     lua_setmetatable(L,-2);
     return 1;
}

static int lb_SUM(lua_State *L)
{
     (...一些代码...)
}

static int lb_SUB(lua_State *L)
{
     (...一些代码...)
}

static int lb_SET(lua_State *L)
{
     (...一些代码...)
}

static const struct luaL_Reg LuaBasic_f [] = {//
        { "NewMatrix", lb_newmatrix},
        {        NULL,         NULL}};

static const struct luaL_Reg LuaBasic_m [] = {//
        { "__add", lb_SUM},
        { "__sub", lb_SUB},
        {    NULL,   NULL}};

static const struct luaL_Reg LuaBasic_oo [] = {//
        { "set", lb_SET},
        {  NULL,   NULL}};

LUA_API int luaopen_LuaBasic(lua_State *L)
{
    // 将基本元表"lb_basic"插入堆栈
    luaL_newmetatable(L,"lb_basic");

    // 注册"lb_basic"中的元方法
    luaL_setfuncs(L,LuaBasic_m,0);

    // 添加OO的过程
    // 不起作用
    //lua_pushvalue(L,-1);
    //lua_setfield(L,-2,"__index");
    //luaL_setfuncs(L,LuaBasic_oo,0);

    luaL_newlib(L,LuaBasic_f);
    return 1;

}

在这份代码中,我有一个用于创建具有"lb_basic"元表的矩阵的函数。在这个元表中,我注册了luaL_Reg LuaBasic_m中的所有函数。

一些函数(我希望它们作为对象)被收集在luaL_Reg LuaBasic_oo中。

我想做的是添加一些对象以便按以下方式使用我的矩阵:

lb = require("LuaBasic")
A = lb.newmatrix(3,4)
B = A+A-A+A;
B:set(2,3,9999)
print(B[2][3])

我该如何将函数lb_SET添加为我的模块的对象?在哪里注册它们?

非常感谢。

点赞