【问题标题】:Conventions for a module that's part C, part Lua部分 C、部分 Lua 的模块的约定
【发布时间】:2013-11-27 01:57:53
【问题描述】:

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

我想知道这些模块的推荐“布局”是什么。

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

  1. posix 模块对 C 模块使用名称“posix_c”。用户不应使用此模块。 Lua 模块,简称为“posix”,导入(和扩充)这个模块。

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

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

【问题讨论】:

    标签: lua


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。这不是我等待的答案,但我想没有“正确”的答案。我最终选择了posix 模块使用的技术。
    猜你喜欢
    • 2013-05-27
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 2018-10-01
    相关资源
    最近更新 更多