在我的应用中,大多数模块都不是纯粹的Lua,或纯粹的C,而是混合模块。
我想知道推荐的"布局"对于这样的模块。
到目前为止,我发现了两种方法:
答案 0 :(得分:1)
如果用户不应该使用某些内容,则应将其隐藏:在注册表中或完全隐藏在Lua模块的upvalue中。这是从Lua到C的调用。对于从C到Lua的调用,唯一的选择是注册表,但如果需要,它可以以非冲突的方式使用,如下所述。
因为它是你的应用程序,你可以简单地依赖注册表本身。在我的应用程序中,我在其中注册内部C函数,并从Lua端分配Lua回调。例如。我的Lua核心脚本开头的一件事是local internal = debug.getregistry()
。加载所有核心脚本后,我可以进行沙盒操作,禁止访问常规脚本以调试库等。
如果你想制作一个独立的模块,我建议做一个C模块,在加载时调用Lua脚本,将“hidden”表传递给它。对于从C到Lua的调用,C代码可以使用模块中任何变量的地址作为轻用户数据键来将“隐藏”表存储在注册表中。