lua的require和module小結 module特性是lua5.1中新增的,用於設定lua檔案自己的模組,最常用的方式是module(name,package.seeall),有時候lua檔名和module設定的名字不一樣,到底require的時候該 require檔名還是require模組(module)名了,今天自己試了一把
首先,如果在lua檔案中不顯示的require,那麼lua執行環境會預設載入哪些呢? 可以通過遍歷package.loaded陣列來檢視,包括以下
string debug package _g io os table math coroutine
新建了乙個lua檔案,取名為moduleb.lua,內容如下
----------------moduleb.lua ------------------
module("module123",package.seeall)
function printb() print('b') end
為了試驗,新建乙個lua檔案,隨便取名為a.lua,首先require模組名試下。如果檔名和模組名不相同時,require模組名是正確的,那麼module123.printb就可正常執行
---------------a.lua:-------------------------
require "module123"
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名來呼叫函式。
lua中的require機制
lua中的require機制 2008 06 05 09 13 27 分類 python ruby lua中的require機制 為了方便 管理,通常會把lua 分成不同的模組,然後在通過require函式把它們載入進來。現在看看lua的require的處理流程。1 require機制相關的資料和函...
lua中的require函式
lua提供高階的require函式來載入執行庫,lua中的require函式功能主要有 1 require函式會搜尋目錄載入檔案 2 require會判斷是否檔案已經載入避免重複載入同一檔案。由於上述特徵,require在lua中是載入庫的更好的函式。require使用的路徑和普通我們看到的路徑還有...
lua中的require機制
lua中的require機制 為了方便 管理,通常會把lua 分成不同的模組,然後在通過require函式把它們載入進來。現在看看lua的require的處理流程。1 require機制相關的資料和函式 package.path 儲存載入外部模組 lua中 模組 和 檔案 這兩個概念的分界比較含糊,...