lua和其他語言一樣,也有模組/包的概念,稍微有點不同的是,預設先從環境變數lua_path中搜尋lua檔案,如果搜尋不到,則從lua_cpath中搜尋c檔案。
對於我來說,時而去改變環境變數,則顯得麻煩,並且在另外的環境中部署時還要修改環境變數,則顯得不人性化,因此,覺得如下方式增加搜尋路徑比較好:
[python]view plain
copy
--將自定義包路徑加入package的搜尋路徑中。也可以加到環境變數lua_path中
local p = "自定義包路徑的父目錄"
local m_package_path = package.path
package.path = string.format("%s;%s?.lua;%s?/init.lua"
, 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檔案
[python]view plain
copy
module(..., package.seeall)
function add(n1, n2)
return
n1 + n2
end
function sub(n1, n2)
return
n1 - n2
end
function div(n1, n2)
ifn2 ~=
0then
return
n1 / n2
else
error("require n2 is not zero"
) end
end
function mul(n1, n2)
return
n1 * n2
end
--a.lua
[python]view plain
copy
module(..., package.seeall)
function p()
"module demopackage.a"
end
function lstostring(ls)
return
""end
上面的兩個檔案中,開頭都有這麼一行**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
[python]view plain
copy
--將自定義包路徑加入package的搜尋路徑中。也可以加到環境變數lua_path中
local p = "e:/dep/code/lua/"
local m_package_path = package.path
package.path = string.format("%s;%s?.lua;%s?/init.lua"
, m_package_path, p, p)
(package.path) --> lua檔案的搜尋路徑
(package.cpath) --> lua c檔案的搜尋路徑
require "demopackage"
require "demopackage.a"
("--------package: demopackage --------------"
) for
i in
pairs(demopackage) do
(i, demopackage[i])
end
("--------package: demopackage.a --------------"
) for
i in
pairs(demopackage.a) do
(i, demopackage.a[i])
end
("---------------demo print--------------"
( demopackage.add(1,
2) )
( demopackage.a.lstostring() )
( demopackage.a.p() )
lua中,用require來載入包,如果想重新命名載入的包,可以如下操作:
local t = require "demopackage", 這時候,就可以用t呼叫demopackage中的功能了。
btw,lua載入包時,不會載入包中所有的模組,這點是跟其他語言不一樣的,這樣做應該是為了提高執行速度吧。
Lua學習筆記六 package
lua和其他語言一樣,也有模組 包的概念,稍微有點不同的是,預設先從環境變數lua path中搜尋lua檔案,如果搜尋不到,則從lua cpath中搜尋c檔案。對於我來說,時而去改變環境變數,則顯得麻煩,並且在另外的環境中部署時還要修改環境變數,則顯得不人性化,因此,覺得如下方式增加搜尋路徑比較好 ...
Lua學習筆記六 package
lua和其他語言一樣,也有模組 包的概念,稍微有點不同的是,預設先從環境變數lua path中搜尋lua檔案,如果搜尋不到,則從lua cpath中搜尋c檔案。對於我來說,時而去改變環境變數,則顯得麻煩,並且在另外的環境中部署時還要修改環境變數,則顯得不人性化,因此,覺得如下方式增加搜尋路徑比較好 ...
Lua學習筆記六 package
標籤 lua path n2module function語言 2009 05 09 15 15 23280人閱讀收藏 舉報 lua 11 lua和其他語言一樣,也有模組 包的概念,稍微有點不同的是,預設先從環境變數lua path中搜尋lua檔案,如果搜尋不到,則從lua cpath中搜尋c檔案。...