Lua程式設計(三十一)

2021-09-07 20:50:20 字數 1973 閱讀 8085

搜尋路徑

在搜尋乙個lua檔案時,函式require使用的路徑與典型的路徑略有不同。典型的路徑是很多目錄組成的列表,並在其中搜尋指定的檔案。不過,iso clua語言依賴的抽象平台)並沒有目錄的概念。所以,函式require使用的路徑是一組模板,其中的每項都指定了將模組名(函式require的引數)轉換為檔名的方式。對於每個模板,函式require會用模組名來替換每乙個問號,然後檢查結果是否存在對應的檔案;如果不存在,則嘗試下乙個模板。路徑中的模板以在大多數作業系統中很少被用於檔名的分號隔開。

例如,

?;?.lua;c:\windows\?;/usr/local/lua/?/?.lua
在使用這個路徑時,呼叫require "sql"將嘗試開啟如下的lua檔案:

sql

sql.lua

c:\windows\sql

/usr/local/lua/sql/sql.lua

函式require只處理分號(作為分隔符)和問號,所有其他的部分(包括目錄分隔符和副檔名)則由路徑自己定義。

函式require用於搜尋lua檔案的路徑是變數package.path的當前值。當package模組被初始化後,它就把變數package.path設定成環境變數lua_path_5_3的值。如果這個環境變數沒有被定義,那麼lua語言則嘗試另乙個環境變數lua_path。如果這兩個環境變數都沒有被定義,那麼lua語言則使用乙個編譯時定義的預設路徑。在使用乙個環境變數的值時,lua語言會將其中所有的";;"替換成預設路徑。

搜尋c標準庫的邏輯與此相同,只不過c標準庫的路徑來自變數package.cpath

函式package.searchpath中實現了搜尋庫的所有規則,該函式的引數包括模組名和路徑,然後遵循上述規則來搜尋檔案。

實驗版package.searchpath

function search(modname, path)

modname = string.gsub(modname, "%.", "/")

local msg = {}

for c in string.gmatch(path, "[^;]+") do

local fname = string.gsub(c, "?", modname)

local f = io.open(fname)

if f then

f:close()

return fname

else

msg[#msg + 1] = string.format("\n\tno file '%s'", fname);

endend

return nil, table,concat(msg)

end

上述函式首先替換目錄分隔符,即把.換成/。之後,該函式遍歷路徑中的所有組成部分,也就是每乙個不含分號的最長匹配。對於每乙個組成部分,該函式使用模組名來替換問號得到最終的檔名,然後檢查相應的檔案是否存在。如果存在,該函式關閉這個檔案,然後返回檔案的名稱;否則,該函式儲存失敗的檔名用於可能的錯誤提示。如果乙個檔案都找不到,該函式返回nil及最終的錯誤資訊。

UNIX網路程式設計 流(三十一)

unix網路程式設計 流 三十一 一 概述 了解網路協議在流框架中的實現機制。使用傳輸提供者介面開發乙個簡單的tcp客戶程式。tpi是在基於流的系統上xti和套接字通常使用的傳輸層訪問介面。二 概貌 流在程序和驅動程式之間提供全雙公的鏈結。流頭由一些核心例程構成,應用程序針對流描述符執行系統呼叫 例...

python程式設計基礎之三十一

物件導向 一開始接觸物件導向其實感覺不好用,但是對於一些複雜的問題,使用物件導向其實更加容易,邏輯不容易混亂 它的核心是 類 和 物件 類 對一系列事物的抽象概念,可以視為一張圖紙,物件 就是對類這種抽象概念例項化出乙個具體的東西,也可以理解成按照圖紙說明製造的乙個實物,不同實物之間肯定會有不一樣,...

OpenCV Python 模板匹配 三十一

在本章中,您將學習 如果輸入影象的大小為 wxh 而模板影象的大小為 wxh 則輸出影象的大小將為 w w 1,h h 1 得到結果後,可以使用cv.minmaxloc 函式查詢最大 最小值在哪。將其作為矩形的左上角,並以 w,h 作為矩形的寬度和高度。該矩形是您模板的區域。注意如果使用cv.tm ...