模块的约定是C部分,Lua部分

时间:2013-11-25 06:12:10

标签: lua

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

我想知道推荐的"布局"对于这样的模块。

到目前为止,我发现了两种方法:

  1. posix模块使用名称" posix_c"对于C模块。用户不应该使用此模块。 Lua模块,简称为#34; posix",导入(并扩充)此模块。

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

  3. 您推荐的方法是什么?还有其他方法吗?

1 个答案:

答案 0 :(得分:1)

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

因为它是你的应用程序,你可以简单地依赖注册表本身。在我的应用程序中,我在其中注册内部C函数,并从Lua端分配Lua回调。例如。我的Lua核心脚本开头的一件事是local internal = debug.getregistry()。加载所有核心脚本后,我可以进行沙盒操作,禁止访问常规脚本以调试库等。

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