我想知道如何向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表作为属性。
答案 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设置所有这些常量。
一般来说,它应该用于交换运行时数据,当然,没有内在的原因可以解释为什么在加载模块时你不能用表填充表格。