編寫乙個模組的最簡單方法:
-- 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...