如何从C++将属性暴露给Lua库

我想知道如何将属性公开到 lua 库中。

luaL_openlib(L, kName, kVTable, 1); // leave "library" on top of stack

通过这样,我只能公开函数,因为 kVTable 是指向 luaL_Reg 的。

typedef struct luaL_Reg {
  const char *name;
  lua_CFunction func;
} luaL_Reg;

例如:使用上述代码。我可以执行以下操作。

local myLib = require "plugin.myLib"
myLib.newFunc();

但是,我想将 Lua 表公开到库中作为 CONSTANTS 变量。

myLib.CONSTANTS.SOME_CONST_1
myLib.CONSTANTS.SOME_CONST_2

等等。请告诉我如何将 lua 表从我的库中作为属性公开。

点赞
用户847349
用户847349

如果你使用C++,你可以使用一个绑定库,例如头文件 luabridge 来将一些数据绑定到命名表上。将你的例子转换为LuaBridge,在初始化Lua状态后调用这个函数:

void register_constants (lua_State* L) {

    luabridge::getGlobalNamespace(L)
        .beginNamespace("myLib")
            .beginNamespace("CONSTANTS")
                .addVariable("SOME_CONST_1",&some_const_1,false/*read-only*/)
                .addVariable("SOME_CONST_2",&some_const_2,false/*read-only*/)
            .endNamespace()
        .endNamespace()
    ;
}

...

lua_State* L=lua_open();
register_constants(L);
...

就可以像你的最后那段代码片段那样访问常量。

2013-09-25 13:54:53
用户752976
用户752976

注意,读者,因为 Lua C API 是 C API,所以有些限制。

关于 loadlib 和其他类似的函数进行操作的主要原因是使用 C 很难传递函数(C 函数不是一级值)。因此,我最好使用普通的堆栈 API 设置所有这些常量。

一般来说,它用于交换运行时数据,当然,加载模块时用它填充表格也没有本质上的问题。

2013-09-25 13:55:31
用户2733013
用户2733013

由于 luaL_openlib 在栈顶留下了库表,因此您可以使用常规的 C API 将新字段和子表添加到其中:

luaL_openlib( L, kName, kVTable, 1 ); // 在栈顶留下“库”表
lua_pushstring(L, "CONSTANTS");
lua_newtable(L); // 这将是 CONSTANTS 子表

lua_pushstring(L, "SOME_CONST_1");
lua_pushnumber(L, 42); // SOME_CONST_1 值
lua_settable(L, -3); // 设置 SOME_CONST_1

lua_pushstring(L, "SOME_CONST_2");
lua_pushnumber(L, 12345); // SOME_CONST_2 值
lua_settable(L, -3); // 设置 SOME_CONST_2

lua_settable(L, -3); // 将 CONSTANTS 表设置为库表的字段
return 1;
2013-09-26 04:20:29