Lua的require和module小結

2022-03-24 12:46:44 字數 2834 閱讀 7032

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中 模組 和 檔案 這兩個概念的分界比較含糊,...