Lua的require和module小結

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名來調用函數。      

相關文章
相關標籤/搜索