包含子包的Lua包

时间:2014-12-04 21:08:21

标签: lua lua-api

我在C中为Lua编写了许多模块。每个模块都包含一个Lua userdata类型,我加载并使用它们:

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")

2 个答案:

答案 0 :(得分:2)

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

通常,require在尝试使用C库时用下划线替换点。

答案 1 :(得分:1)

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

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

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

A = require "AandB".A