c - luaL_openlib 替代 Lua 5.2

标签 c lua embedding lua-5.2

我正在调整一个为 Lua < 5.2 编写的库,然后接到了一个我不知道的等价物的电话:

luaL_openlib(L, "Polycore", polycoreLib, 0);

polycoreLib 是一个

static const struct luaL_Reg polycoreLib []

如何替换对 luaL_openlib 的调用?

仅限 lua wiki states :

Calls such as luaL_openlib(L, name, lreg, x); should be carefully rewritten because a global table with the given name will be searched and possibly created.

最佳答案

对此有两个答案:一种用于复制早期版本的行为(创建全局表),另一种用于实现现在常规的行为(即创建和返回匿名表)。

对于前者:

lua_newtable(L);
luaL_setfuncs(L, polycoreLib, 0);
lua_setglobal(L, "Polycore");

这与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");

后者更容易,因为你不需要关心合并:

lua_newtable(L);
luaL_setfuncs(L, polycoreLib, 0);
return 1;

使用这种方法,调用者负责绑定(bind)表,如下所示:

local Polycore = require "Polycore"

关于c - luaL_openlib 替代 Lua 5.2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19041215/

相关文章:

c - 如果传递了错误的参数类型,我怎么能 'crash proof' 用 C 编写的回调函数

c - 链接到外部 C 库的 R 包

c# - C# 中的简单 Lua 语法检查

lua - 意外的 lua 模式匹配结果

ruby-on-rails - Mongoid 在父级内部创建嵌入文档

c - 当 Linux 在 C 程序中崩溃时获得更好的调试

lua - Lua 中的字符串替换

java - 定义和重用 MVEL 函数

c# - 使用 Mono API 启动新线程和打开对话框时出错

C - char* 为空?