Lua學習筆記六 package

2021-08-03 08:52:37 字數 3316 閱讀 2169

標籤: lua

path

n2module

function語言

2009-05-09 15:15

23280人閱讀收藏 

舉報

lua(11)

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()  

print

"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)  

--print

(package.path)       --> lua檔案的搜尋路徑  

--print

(package.cpath)      --> lua c檔案的搜尋路徑  

require "demopackage"

require "demopackage.a"

print

("--------package: demopackage --------------"

)  for

i in

pairs(demopackage) do  

print

(i, demopackage[i])  

end  

print

("--------package: demopackage.a --------------"

)  for

i in

pairs(demopackage.a) do  

print

(i, demopackage.a[i])  

end  

print

("---------------demo print--------------"

)  print

( demopackage.add(1, 

2) )  

print

( demopackage.a.lstostring() )  

print

( 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和其他語言一樣,也有模組 包的概念,稍微有點不同的是,預設先從環境變數lua path中搜尋lua檔案,如果搜尋不到,則從lua cpath中搜尋c檔案。對於我來說,時而去改變環境變數,則顯得麻煩,並且在另外的環境中部署時還要修改環境變數,則顯得不人性化,因此,覺得如下方式增加搜尋路徑比較好 ...