如何从C ++向Lua Library公开属性

时间:2013-09-25 06:23:24

标签: 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 Table作为CONSTANTS变量公开给库。

myLib.CONSTANTS.SOME_CONST_1
myLib.CONSTANTS.SOME_CONST_2

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

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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);
...

您可以访问常量作为最后一个代码段

答案 2 :(得分:0)

Caveat,lector ,因为Lua C API就是C API。

loadlib和朋友的整个负担是因为使用C函数很难传递(C函数不是第一类值)。所以我最好的选择是使用常规堆栈API设置所有这些常量。

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