【问题标题】:Lua package containing subpackages包含子包的 Lua 包
【发布时间】:2014-12-05 19:56:45
【问题描述】:

我用 C 语言为 Lua 编写了许多模块。每个模块都包含一个 Lua 用户数据类型,我像这样加载和使用它们:

A = require("A")
B = require("B")
a = A.new(3,{1,2,3})
b1 = B.new(1)
b2 = B.new(2) * b1

现在我想将两种 userdata 类型放在一个共享库 AandB 中,可以像这样使用

AB = require("AandB")
AB.A.new(3,{1,2,3})

什么是实现这一目标的好方法?现在我的luaopen_* 函数看起来像这样

int luaopen_A(lua_State *L) {
  luaL_newmetatable(L, A_MT);
  luaL_setfuncs(L, A_methods, 0);

  luaL_newlib(L, A_functions);

  return 1;
};

然后是否有可能仍然只加载部分,例如像这样:A = require("AandB.A")?

【问题讨论】:

    标签: lua lua-api


    【解决方案1】:

    如果您在 C 库中定义 luaopen_AandB_Arequire("AandB.A") 有效,必须将其命名为 AandB.so

    一般来说,require 在尝试 C 库时会将点替换为下划线。

    【讨论】:

    • 如何确保库不会被多次加载?
    • 解释我的评论:如果我理解正确加载库将按名称将其添加到_LOADED,因此如果我同时加载AandBAandB.A,那么最后一位将加载两次。我将继续阅读 Lua 代码来尝试解决这个问题,但我们不胜感激。
    【解决方案2】:

    您可以做的一件事是编写一个 lua 脚本模块,该模块同时引入 AB。然后,您可以从您的使用代码中要求该脚本:

    -- AandB.lua
    return { A = require 'A', B = require 'B' }
    

    如果您只想加载部分模块,您可以这样做:

    A = require "AandB".A
    

    【讨论】:

    • 您也可以使用 C 来执行此操作,甚至可能将所有三个模块都放在同一个 .so 我认为。此外,如果模块嵌套在文件系统中,则应该可以加载子模块而无需加载主模块并从中索引字段。
    猜你喜欢
    • 1970-01-01
    • 2015-03-08
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 2012-02-13
    • 1970-01-01
    相关资源
    最近更新 更多