Lua的require和module小結 module特性是lua5.1中新增的,用於設置Lua文件本身的模塊,最經常使用的方式是module(name,package.seeall),有時候lua文件名和module設置的名字不同,到底require的時候該 require文件名仍是require模塊(module)名了,今天本身試了一把 windows
首先,若是在lua文件中不顯示的require,那麼lua運行環境會默認加載哪些呢? 能夠經過遍歷package.loaded數組來查看,包括如下數組
string debug package _G io os table math coroutine 函數
新建了一個lua文件,取名爲moduleB.lua,內容以下ui
----------------moduleB.lua ------------------ lua
module("module123",package.seeall) debug
function printB() print('B') end string
爲了試驗,新建一個lua文件,隨便取名爲A.lua,首先require模塊名試下。若是文件名和模塊名不相同時,require模塊名是正確的,那麼module123.printB就可正常執行it
---------------A.lua:------------------------- io
require "module123"table
module123.printB()
執行的結果是,報錯,錯誤以下
lua: printtt.lua:2: module 'module123' not found:
no field package.preload['module123']
no file '.\module123.lua'
no file 'C:\Program Files (x86)\Lua\5.1\lua\module123.lua'
no file 'C:\Program Files (x86)\Lua\5.1\lua\module123\init.lua'
no file 'C:\Program Files (x86)\Lua\5.1\module123.lua'
no file 'C:\Program Files (x86)\Lua\5.1\module123\init.lua'
no file 'C:\Program Files (x86)\Lua\5.1\lua\module123.luac'
no file '.\module123.dll' no file '.\module12351.dll'
no file 'C:\Program Files (x86)\Lua\5.1\module123.dll'
no file 'C:\Program Files (x86)\Lua\5.1\module12351.dll'
no file 'C:\Program Files (x86)\Lua\5.1\clibs\module123.dll'
no file 'C:\Program Files (x86)\Lua\5.1\clibs\module12351.dll'
no file 'C:\Program Files (x86)\Lua\5.1\loadall.dll'
no file 'C:\Program Files (x86)\Lua\5.1\clibs\loadall.dll' stack traceback: [C]: in function 'require' printtt.lua:2: in main chunk [C]: ?
既然require模塊名報錯,那麼reqire文件名呢?若是require文件名是正確的,那麼該以怎樣的形式調用printB函數呢?
第一種:
-----------------------A.lua-----------------------
require "moduleB"
moduleB.printB()
第二種:
-----------------------A.lua-----------------------
require "moduleB"
module123.printB()
通過驗證,第二種是正確的。
即require時是文件名,而調用對應函數時,則使用模塊(module)調用函數。
爲何是這樣的,這個取決於require的搜索機制:
1:require時首先去全局變量package.loaded查找模塊是否被加載過。若是加載過直接返回,不然到2
2: 去package,preload中查找可適用於模塊的加載器,通常是找不到的,轉到3
3:到對應的目錄找指定模塊.lua文件,若是存在,則用loadfile加載文件,注意只是加載代碼,而不是執行
4:若是沒有對應的lua文件,則會去相應目錄存在c程序庫,若是存在,會用loadlib加載 那麼尋找lua文件和c文件對應的默認路徑是什麼呢? 以windows爲例,lua 5.1版本程序安裝在C:\Program Files (x86)\Lua\5.1目錄下,用PWD代替 尋找lua文件默認路爲: .\?.lua;PWD\lua\?.lua;PWD\lua\?\init.lua;PWD\?.lua;PWD\?\init.lua;PWD\lua\?.luac 尋找c程序庫默認路徑爲:.\?.dll;.\?51.dll;PWD\?.dll;PWD\?51.dll;PWD\clibs\?.dll;PWD\clibs\?51.dll;PWD\loadall.dll;PWD\clibs\loadall.dll
綜上所述,當lua文件名和模塊module名不一樣時,應該require文件名,同時用模塊module名來調用函數。