lua 模組與環境

2022-07-31 14:24:19 字數 3223 閱讀 3396

編寫乙個模組的最簡單方法:

-- complex.lua

--

模組實際上是乙個表

complex

={}

--

定義模組函式

function

complex

.add(c1

,c2)...

end

--

呼叫模組內部的函式,需要

complex

.字首

function

complex

.calladd(c1

,c2)

complex

.add(c1

,c2)

end

--

之前的宣告把所有函式都放入

complex

表中了,最後返回這個表

return

complex

呼叫這個模組時:

--

main

.lua

local

complex

=require

("complex"

)

complex

.add(x

,y)

上述**有幾點麻煩:

1.在模組內部,乙個函式呼叫另乙個函式時,必須加上complex字首

2.最後必須返回complex這個表

改進的辦法:

--

complex

.lua

--

模組實際上是乙個表,這裡從

require

的引數(...)獲取模組名稱

local

modname

=...

--

模組的內部名稱

m

localm =

{}

--

lua的全域性變數預設儲存地方為_g,

_g[modname]=

m 等價於定義乙個名字為

modname

的全域性變數

_g

[modname]=

m

--

require

函式當乙個函式無返回值的時候,會返回

package

.loaded

[模組名]的值

--

於是這樣寫就可以省去最後的

return

語句了

package

.loaded

[modname]=

m

--

setfenv

是lua

版本的using

namespace

m,這樣寫就可以避免每次都加

m.字首了

--

為了能夠訪問其他全域性變數,把

m的元表的

__index

欄位設為

_g,這樣不在

m表的函式和變數就會到

_g表查詢

setmetatable(m

,)

setfenv(1

,m)

--

定義模組函式,注意,模組名稱被省略

function

add(c1,

c2)...end

--

呼叫模組內部的函式,需要

complex

.字首

function

calladd(c1

,c2)

add(c1

,c2)

end

--

不用返回這個表

--

return

m

上述的**好麻煩,lua5.1提供了乙個函式,完成等價功能,只需要這樣寫:

--

complex

.lua

--

module

等價於上述一大段函式,

package

.seeall

讓這個模組可以訪問

_g中的變數

--

如果只呼叫

mudule

(...)就不能訪問

module

(...,

package

.seeall

)

--

定義模組函式,注意,模組名稱被省略

function

add(c1,

c2)...end

--

呼叫模組內部的函式,需要

complex

.字首

function

calladd(c1

,c2)

add(c1

,c2)

end

--

不用返回這個表

--

return

m

來自為知筆記(wiz)

Lua 模組與包

模組類似於乙個封裝庫,從 lua 5.1 開始,lua 加入了標準的模組管理機制,可以把一些公用的 放在乙個檔案裡,以 api 介面的形式在其他地方呼叫,有利於 的重用和降低 耦合度。lua 的模組是由變數 函式等已知元素組成的 table,因此建立乙個模組很簡單,就是建立乙個 table,然後把需...

Lua 模組與包

模組類似於乙個封裝庫,從lua 5.1開始,lua加入了標準的模組管理機制,可以把一些公用的 放在乙個檔案裡,以api介面的形式在其他地方呼叫,有利於 的重用和降低 耦合度。lua的模組是由變數 函式等已知元素組成的table,因此建立乙個模組很簡單,就是建立乙個table,然後把需要匯出的常量 函...

Lua 模組與包

從使用者觀點來看,乙個模組就是乙個程式庫,可以通過require來載入 require用於使用模組,module用於建立模組 然後便得到了乙個全域性變數,表示乙個table,這個table就像乙個名字空間,其內容就是模組中匯出的所有東西,例如函式和變數。乙個規範的模組還應使require返回這個ta...