2014-12-04 91 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