App*_*ell 22 c lua embedding lua-5.2
我正在调整为Lua <5.2编写的库,并接到一个我不知道相当于的电话:
luaL_openlib(L, "Polycore", polycoreLib, 0);
Run Code Online (Sandbox Code Playgroud)
哪里polycoreLib是
static const struct luaL_Reg polycoreLib []
Run Code Online (Sandbox Code Playgroud)
如何将呼叫替换为luaL_openlib?
lua wiki只说:
luaL_openlib(L, name, lreg, x);应该仔细重写这样的调用,因为将搜索并可能创建具有给定名称的全局表.
Tox*_*rog 31
这有两个答案:一个用于复制早期版本的行为(创建全局表),另一个用于实现现在常规的行为(即创建并返回匿名表).
对于前者:
lua_newtable(L);
luaL_setfuncs(L, polycoreLib, 0);
lua_setglobal(L, "Polycore");
Run Code Online (Sandbox Code Playgroud)
这是不是很一样luaL_openlib,因为如果有一个现有的全局表Polycore将覆盖它,而不是与它合并.如果合并是一个问题,lua_getglobal首先使用,然后如果它推动表重用而不是创建一个新表:
lua_getglobal(L, "Polycore");
if (lua_isnil(L, -1)) {
lua_pop(L, 1);
lua_newtable(L);
}
luaL_setfuncs(L, polycoreLib, 0);
lua_setglobal(L, "Polycore");
Run Code Online (Sandbox Code Playgroud)
后者更容易,因为您不需要关心合并:
lua_newtable(L);
luaL_setfuncs(L, polycoreLib, 0);
return 1;
Run Code Online (Sandbox Code Playgroud)
使用这种方法,调用者可以重新绑定表,如下所示:
local Polycore = require "Polycore"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9433 次 |
| 最近记录: |