該模塊env
部分實現你正在尋找的東西,雖然它遠非完美。
它允許分組/命名導入,但有一些注意事項 - 主要是您必須手動管理您的環境。此外,您需要編寫索引文件(默認init.lua
,除非您編寫自定義路徑集),因爲它旨在用於導出表的模塊。
這是一個例子。首先,我們需要正確設置我們的文件結構。
-- main.lua
-- calculations/
-- calc1.lua
-- calc2.lua
-- calc3.lua
-- init.lua
-- helper/
-- print/
-- init.lua
-- graphprinter.lua
-- matrixprinter.lua
索引文件,這是稍微繁瑣:
-- calculations/init
return {
calc1 = require 'calculations.calc1',
calc2 = require 'calculations.calc2',
calc3 = require 'calculations.calc3'
}
和
-- helpers/print/init
return {
graphprinter = require 'helper.print.graphprinter',
matrixprinter = require 'helper.print.matrixprinter'
}
內,您的主文件。主要的注意事項很快顯示出來,您必須使用通過要求'env'
覆蓋您的本地環境返回的功能。傳遞任何參數都會創建當前環境的克隆(保留require
等)。
-- main.lua
local _ENV = require 'env'() -- (see notes below)
新的環境將給出一個import
函數,它只有一個參數,字符串代表路徑或模塊名稱導入到當前的環境。返回值是一個可以用來進一步改變環境狀態的瞬態表。
import 'helper/print' :use '*'
import 'calculations' :use '*'
一對瞬態表的功能是:use
,這無論是將表指示哪些值從所需的表拉,或串'*'
,這表明你想從所需的表中的所有值擺在當前的環境
print(matrixprinter, graphprinter) --> function: 0x{...} function: 0x{...} (or so)
最後需要注意的是,所有你見過的路徑是在cwd
是相同的作爲保持main.lua
的一個依賴。 lua myapp/main.lua
將會大聲失敗,除非您將子模塊放置在靜態位置,並且正確調整package.path
/import.paths
。
似乎很多工作,以避免幾行require
陳述。
免責聲明:我寫了env
作爲一個有點實驗。
注意import
目前不支持.
語法(您需要使用您的操作系統的路徑分隔符),或適當爆炸表到錶鏈。我在解決這個問題的作品中有一點補丁。
Lua 5.2+使用_ENV
覆蓋本地環境。對於Lua 5.1,您需要使用。
如上所述,Lua沒有真正的目錄概念。爲了真正做到你想要的(用更少的開銷),你需要編寫你自己的定製模塊加載器,環境處理器,並且可能使用像LuaFileSystem這樣的模塊來可靠地'自動'加載目錄中的所有文件。
TL; DR:
- 這是一個棘手的話題。
- 語言中沒有任何東西可以使這一點變得簡單。
- 你需要寫一些自定義的東西。
- 總會有缺點。
來源
2016-11-10 16:59:09
Oka
Lua無法獲取文件夾中所有文件的列表,因此無法獲取模塊列表。但是你可以編寫一個腳本來獲取模塊列表,方法是用'io.popen「ls ...」'發出shell命令,然後'require()'找到所有模塊。 –
還有重新創建不能在模塊中創建全局變量。因此,即使您可以加載所有模塊值,也無法獲得模塊值。所以,可能只是讓單獨的文件至極做負載加載值表中的所有需要的值並返回。 – moteus