2014-12-04 92 views
3

我在C.写入多个模块为lua每个这些包含一个Lua用户数据的类型和予加载和使用它们是这样的:的Lua含包的子包

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

现在我想把两者用户数据类型在一个单一的共享库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")

回答

1

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

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

如果你只想要加载模块的一部分,你可以这样做:

A = require "AandB".A 
+1

你也可以用C来做到这一点,甚至可能把所有三个模块放在同一个'.so'中。此外,如果模块嵌套在文件系统中,则应该可以加载子模块而不加载主模块并将字段编入索引。 – 2014-12-05 00:10:09

2

require("AandB.A")的作品,如果你在你的C定义luaopen_AandB_A图书馆,它必须被称为AandB.so

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

+0

你将如何确保图书馆不被多次加载? – 1k5 2014-12-05 08:56:30

+0

解释我的评论:如果我理解正确加载库将按名称将其添加到'_LOADED',所以如果我加载'AandB'和'AandB.A',则最后一位加载两次。我会继续阅读Lua代码来尝试解决这个问题,但任何提示都会被赞赏。 – 1k5 2014-12-05 10:17:15