3

我想知道我们如何将属性公开给 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 Table 作为 CONSTANTS 变量公开给库。

myLib.CONSTANTS.SOME_CONST_1
myLib.CONSTANTS.SOME_CONST_2

等请让我知道如何从我的库中公开 lua 表作为属性。

4

3 回答 3

3

由于luaL_openlib将库表留在堆栈顶部,您可以使用常规 C API 向其中添加新字段和子表:

luaL_openlib( L, kName, kVTable, 1 ); // leaves "library" on top of stack
lua_pushstring(L, "CONSTANTS"); 
lua_newtable(L); // this will be CONSTANTS subtable

lua_pushstring(L, "SOME_CONST_1");
lua_pushnumber(L, 42); // SOME_CONST_1 value
lua_settable(L, -3); // sets SOME_CONST_1

lua_pushstring(L, "SOME_CONST_2");
lua_pushnumber(L, 12345); // SOME_CONST_2 value
lua_settable(L, -3); // sets SOME_CONST_2

lua_settable(L, -3); // sets CONSTANTS table as field of the library table
return 1;
于 2013-09-26T04:20:29.477 回答
0

警告,讲师,因为 Lua C API 是 C API。

和朋友的全部负担loadlib是因为使用 C 传递函数要困难得多(C 函数不是一流的值)。所以我最好的选择是使用常规堆栈 API 设置所有这些常量。

一般来说,它当然应该用于交换运行时数据,但是没有内在的原因为什么在加载模块时不能用它来填充表。

于 2013-09-25T13:55:31.713 回答
0

如果你使用 C++,你可以使用一个绑定库,比如只有头文件的luabridge来将一些数据绑定到 Lua 中的命名表。将您的示例转换为 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-25T13:54:53.310 回答