Lua 模塊與包
模塊類似於一個封裝庫,從 Lua 5.1 開始,Lua 加入了標準的模塊管理機制,可以把一些公用的代碼放在一個文件裏,以 API 接口的形式在其他地方調用,有利於代碼的重用和降低代碼耦合度。
Lua 的模塊是由變量、函數等已知元素組成的 table,因此創建一個模塊很簡單,就是創建一個 table,然後把需要導出的常量、函數放入其中,最後返回這個 table 就行。以下爲創建自定義模塊 module.lua,文件代碼格式如下:
-- 文件名爲 module.lua
-- 定義一個名爲 module 的模塊
module = {}
-- 定義一個常量
module.constant = "這是一個常量"
-- 定義一個函數
function module.func1()
io.write("這是一個公有函數!\n")
end
local function func2()
print("這是一個私有函數!")
end
function module.func3()
func2()
end
return module
由上可知,模塊的結構就是一個 table 的結構,因此可以像操作調用 table 裏的元素那樣來操作調用模塊裏的常量或函數。
上面的 func2 聲明爲程序塊的局部變量,即表示一個私有函數,因此是不能從外部訪問模塊裏的這個私有函數,必須通過模塊裏的公有函數來調用.
require 函數
Lua提供了一個名爲require的函數用來加載模塊。要加載一個模塊,只需要簡單地調用就可以了。例如:
require("<模塊名>")
--or
require "<模塊名>"
-----------------------
-- test_module.lua 文件
-- module 模塊爲上文提到到 module.lua
require("module")
print(module.constant)
module.func3()
---------------------------------
這是一個常量
這是一個私有函數!
-------------------------------------
--或者給加載的模塊定義一個別名變量,方便調用:
test_module2.lua 文件
-- test_module2.lua 文件
-- module 模塊爲上文提到到 module.lua
-- 別名變量 m
local m = require("module")
print(m.constant)
m.func3()
-------------------------------
這是一個常量
這是一個私有函數!
C 包
Lua和C是很容易結合的,使用 C 爲 Lua 寫包。
與Lua中寫包不同,C包在使用以前必須首先加載並連接,在大多數系統中最容易的實現方式是通過動態連接庫機制。
Lua在一個叫loadlib的函數內提供了所有的動態連接的功能。這個函數有兩個參數:庫的絕對路徑和初始化函數。所以典型的調用的例子如下:
local path = "/usr/local/lua/lib/libluasocket.so"
local f = loadlib(path, "luaopen_socket")
loadlib 函數加載指定的庫並且連接到 Lua,然而它並不打開庫(也就是說沒有調用初始化函數),反之他返回初始化函數作爲 Lua 的一個函數,這樣我們就可以直接在Lua中調用他。
如果加載動態庫或者查找初始化函數時出錯,loadlib 將返回 nil 和錯誤信息。我們可以修改前面一段代碼,使其檢測錯誤然後調用初始化函數:
local path = "/usr/local/lua/lib/libluasocket.so"
-- 或者 path = "C:\\windows\\luasocket.dll",這是 Window 平臺下
local f = assert(loadlib(path, "luaopen_socket"))
f() -- 真正打開庫