2016-08-01 22 views
2

在香草的Lua 5.2,我有一個包含模塊:模塊利用彼此的本地對象

  • 兩個本地函數,A和B:B總是會調用A,A有時會調用B和有時會調用C中存儲的函數;

  • C:表(本地)。它包含包含表格的表格,這些表格可以包含表格......這些表格最後包含功能。這些功能可能會調用A或B;

  • 然後返回函數D,當我的模塊使用require加載時,將返回該函數。它將調用A.

最後,它看起來非常像這樣:

--don't pay attention to what the functions do: 
--I am only writing them down to explain how they interact with each other 

local A, B, C 

C = { 
    ... 
    { 
     function(a) 
      B(a) 
     end 
    } 
    ... 
} 

A = function(a) 
    ... 
    if (...) then 
     B(a) 
    end 
    ... 
    if (...) then 
     C[...]...[...](a) 
    end 
    ... 
end 

B = function(a) 
    A(a) 
end 

return function(s) -- we called this one D 
    A(s) 
end 

現在,我的問題是這樣的:C的聲明使用了自己的局部變量,元表和所有東西,直到我把它的聲明放在do ... end塊中。

它也是 - 對於每個花括號和縮進等表格和換行符中的所有表格 - 相當長。所以我想把它放在它自己的模塊中,但它不能訪問B.

所以,我的問題是:是否有一種方法可以傳遞B,甚至可以將A傳遞到加載C時聲明的文件它?我的意思是這樣,如果有可能:

--in the original module 
local A, B, C 

C = require("c", A, B) 

... 

,然後在c.lua:

local A, B = select(1, ...), select(2, ...) 

C = { 
    ... 
    { 
     function(a) 
      B(a) 
     end 
    } 
    ... 
} 

我真的對如何做到這一點不知道。

有沒有一種方法可以將需求文件中的變量傳遞給所需的文件,而不需要在全局名稱空間中插入變量?

回答

2

主要模塊:

local A, B, C 

A = function(a) 
    ... 
    if (...) then 
     B(a) 
    end 
    ... 
    if (...) then 
     C[...]...[...](a) 
    end 
    ... 
end 

B = function(a) 
    A(a) 
end 

C = require("c")(A, B) 

return function(s) -- we called this one D 
    A(s) 
end 

c.lua:

local function C_constructor(A, B) 
    local C = 
     { 
      ... 
      { 
       function(a) 
        B(a) 
       end 
      } 
      ... 
     } 
    return C 
end 

return C_constructor 
+0

這很聰明,真的很聰明。 – user6245072

0

是否有一種方法可以將需求文件中的變量傳遞給所需的文件,而不需要在全局名稱空間中插入變量?

不與默認的require功能,但不應該阻止你編寫自己的require功能,這樣做。顯然,這將使解決方案專用於您的應用程序,因此當使用標準Lua解釋器(使用其require函數)時,這些所需文件將無法正常運行。

+0

這實際上_will_阻止我笑。實際上,我不是在編寫獨立的應用程序,而且有一天我會將整個代碼庫轉換爲C或C++,那麼爲什麼要麻煩呢? – user6245072