Lua中的模組

2021-06-22 00:22:19 字數 2686 閱讀 6881

從lua 5.1開始,我們可以使用require和module函式來獲取和建立lua中的模組。從使用者的角度來看,乙個模組就是乙個程式庫,可以通過require來載入,之後便得到乙個型別為table的全域性變數。此時的table就像名字空間一樣,可以訪問其中的函式和常量,如:

1

require

"mod

"2 mod.foo()

3local m2 = require

"mod2"4

local f = mod2.foo

5 f()

1. require函式:

require函式的呼叫形式為require "模組名"。該呼叫會返回乙個由模組函式組成的table,並且還會定義乙個包含該table的全域性變數。在使用lua中的標準庫時可以不用顯示的呼叫require,因為lua已經預先載入了他們。

require函式在搜素載入模組時,有一套自定義的模式,如:

?;?.lua;c:/windows/?;/usr/local/lua/?/?.lua

在上面的模式中,只有問號(?)和分號(;)是模式字元,分別表示require函式的引數(模組名)和模式間的分隔符。如:呼叫require "sql",將會開啟以下的檔案:

sqlsql.lua

c:/windows/sql

/usr/local/lua/sql/sql.lua

lua將require搜尋的模式字串放在變數package.path中。當lua啟動後,便以環境變數lua_path的值來初始化這個變數。如果沒有找到該環境變數,則使用乙個編譯時定義的預設路徑來初始化。如果require無法找到與模組名相符的lua檔案,就會找c程式庫。c程式庫的搜尋模式存放在變數package.cpath中。而這個變數則是通過環境變數lua_cpath來初始化的。

2. 編寫模組的基本方法:

見如下**和關鍵性注釋:

1

--將模組名設定為require的引數,這樣今後重新命名模組時,只需重新命名檔名即可。

2local modname = ...

3local m = {}

4_g[modname] = m

56 m.i = --

定義乙個模組內的常量。

7function m.new(r,i) return end

8function m.add(c1,c2)

9return m.new(c1.r + c2.r,c1.i + c2.i)

10end

1112

function m.sub(c1,c2)

13return m.new(c1.r - c2.r,c1.i - c2.i)

14end

15--

返回和模組對應的table。

16return m

3. 使用環境:

仔細閱讀上例中的**,我們可以發現一些細節上問題。比如模組內函式之間的呼叫仍然要保留模組名的限定符,如果是私有變數還需要加local關鍵字,同時不能加模組名限定符。如果需要將私有改為公有,或者反之,都需要一定的修改。那又該如何規避這些問題呢?我們可以通過lua的函式「全域性環境」來有效的解決這些問題。見如下修改的**和關鍵性注釋:

1

--模組設定和初始化。這一點和上例一致。

2local modname = ...

3local m = {}

4_g[modname] = m56

--宣告這個模組將會用到的全域性函式,因為在setfenv之後將無法再訪問他們,7--

因此需要在設定之前先用本地變數獲取。

8local sqrt = mat.sqrt

9local io = io

1011

--在這句話之後就不再需要外部訪問了。

12setfenv(1,m)

1314

--後面的函式和常量定義都無需模組限定符了。

15 i =

16function new(r,i) return end

17function add(c1,c2)

18return new(c1.r + c2.r,c1.i + c2.i)

19end

2021

function sub(c1,c2)

22return new(c1.r - c2.r,c1.i - c2.i)

23end

24--

返回和模組對應的table。

25return m

4. module函式:

在lua 5.1中,我們可以用module(...)函式來代替以下**,如:

1

local modname = ...

2local m = {}

3_g[modname] = m

4package.loaded[modname] = m

5--[[

6和普通lua程式塊一樣宣告外部函式。7--

]]8setfenv(1,m)

由於在預設情況下,module不提供外部訪問,必須在呼叫它之前,為需要訪問的外部函式或模組宣告適當的區域性變數。然後lua提供了一種更為方便的實現方式,即在呼叫module函式時,多傳入乙個package.seeall的引數,如:

module(...,package.seeall)

nginx中Lua模組內建變數

名稱 說明 arg name 請求中的name引數 args 請求中的引數 binary remote addr 遠端位址的二進位制表示 body bytes sent 已傳送的訊息體位元組數 content length http請求資訊裡的 content length content type...

lua模組編寫

lua允許我們編寫自定義模組以便後面呼叫,在編寫模組之前我們先認識2個知識點 1.lua語言中陣列,模組其實都是table 2.在之前的lua基本語法裡我們知道函式是可以賦值給變數的 好,我們新建乙個檔案my.lua 如下 local my my.name 滄浪水 my.url www.freecl...

lua模組載入

module mod name,package.seeall 函式 通過package.seeall選項可令舊全域性環境可見。require mod name 載入指定的模組。先檢測package.loaded表中是否存在modname,存在則直接返回當中的值,沒有則通重載入器載入modname。p...