模块规范,包含 C 和 Lua 两部分

在我的应用程序中,大多数模块都不是纯Lua或纯C,而是混合的。

我想知道适用于这种模块的推荐“布局”。

到目前为止,我已经找到了两种方法:

  1. posix 模块将 C 模块命名为“posix_c”。用户不应该使用此模块。Lua 模块使用简单的名称“posix”导入(并增强)此模块。

  2. Awesome 窗口管理器将 C 部分导出到全局命名空间。由于此名称不在 package.loaded 中,Lua 模块可以具有相同的名称。

你推荐哪种方法?还有其他方法吗?

点赞
用户1365066
用户1365066

如果用户不应该使用某些东西,则应该将它隐藏:可以隐藏在注册表中,或者完全隐藏在 Lua 模块的 upvalue 中。这适用于 Lua 向 C 的调用。对于从 C 到 Lua 的调用,唯一的选择是注册表,但如果需要,它可以以不冲突的方式使用,如下所述。

因为这是您的应用程序,您可以简单地依赖于注册表本身。在我的应用程序中,我在其中注册内部 C 函数,并从 Lua 端将 Lua 回调分配到其中。例如,我的 Lua 核心脚本之一始于 local internal = debug.getregistry()。当加载所有核心脚本后,我可以进行沙箱化,禁用普通脚本访问 debug 库等操作。

如果您想制作一个独立的模块,我建议制作一个 C 模块,在加载时调用 Lua 脚本并传递“隐藏”的表。对于从 C 到 Lua 的调用,C 代码可以使用模块中任何变量的地址作为轻量级用户数据键将“隐藏”表存储在注册表中。

2013-11-26 17:43:37