lua和其他語言一樣,也有模組/包的概念,稍微有點不同的是,預設先從環境變數LUA_PATH中搜尋lua檔案,如果搜尋不到,則從LUA_CPATH中搜尋C檔案。
對於我來說,時而去改變環境變數,則顯得麻煩,並且在另外的環境中部署時還要修改環境變數,則顯得不人性化,因此,覺得如下方式增加搜尋路徑比較好:
--將自訂包路徑加入package的搜尋路徑中。也可以加到環境變數LUA_PATH中<br />local p = "自訂包路徑的父目錄"<br />local m_package_path = package.path<br />package.path = string.format("%s;%s?.lua;%s?/init.lua",<br />m_package_path, p, p)
自訂包檔案及包載入樣本,假如檔案結構如下:
藍色表示檔案夾,紫色表示檔案
----------test.lua
----------demopackage
---------------------init.lua
---------------------a.lua
這時候,demopackage就是一個包了, 模組demopackage的功能由init.lua檔案提供,模組demopackage.a由a.lua檔案提供,下面將在test.lua檔案中調用demopackage包:
--init.lua檔案
module(..., package.seeall)</p><p>function add(n1, n2)<br />return n1 + n2<br />end</p><p>function sub(n1, n2)<br />return n1 - n2<br />end</p><p>function div(n1, n2)<br />if n2 ~= 0 then<br />return n1 / n2<br />else<br />error("require n2 is not zero")<br />end<br />end</p><p>function mul(n1, n2)<br />return n1 * n2<br />end<br />
--a.lua
module(..., package.seeall)</p><p>function p()<br />print "module demopackage.a"<br />end</p><p>function lstostring(ls)<br />return "{" .. table.concat(ls, ", ") .. "}"<br />end<br />
上面的兩個檔案中,開頭都有這麼一行代碼module(..., package.seeall),這是為了模組名以檔案名稱命名,還有為了不汙染全域變數_G,返回當前模組提供的函數等等。相當於:
--將模組名設定為檔案名稱,且載入這個模組
local modname = ...
local M = {}
_G[modname] = M
package.loaded[modname] = M
--引入所需模組
local io = io
local print = print
setfenv(1, M) --> 設定當前環境變數
--開始實現模組功能
function test()
print("test")
end
……
調用demo檔案
--test.lua
--將自訂包路徑加入package的搜尋路徑中。也可以加到環境變數LUA_PATH中<br />local p = "E:/dep/code/lua/"<br />local m_package_path = package.path<br />package.path = string.format("%s;%s?.lua;%s?/init.lua",<br />m_package_path, p, p)</p><p>--print(package.path)--> lua檔案的搜尋路徑<br />--print(package.cpath)--> lua c檔案的搜尋路徑</p><p>require "demopackage"<br />require "demopackage.a"</p><p>print("--------package: demopackage --------------")<br />for i in pairs(demopackage) do<br />print(i, demopackage[i])<br />end</p><p>print("--------package: demopackage.a --------------")<br />for i in pairs(demopackage.a) do<br />print(i, demopackage.a[i])<br />end</p><p>print("---------------demo print--------------")<br />print( demopackage.add(1, 2) )<br />print( demopackage.a.lstostring({"first", "second"}) )</p><p>print( demopackage.a.p() )<br />
lua中,用require來載入包,如果想重新命名載入的包,可以如下操作:
local t = require "demopackage", 這時候,就可以用t調用demopackage中的功能了。
BTW,lua載入包時,不會載入包中所有的模組,這點是跟其他語言不一樣的,這樣做應該是為了提高運行速度吧。