加載碼的精髓 |
|
loadstring
[1] 函數會針對指定的編譯後 Lua 位元組碼或 Lua 原始碼字串建立一個 Lua 函數,而 loadstring
會將 Lua 原始碼編譯為 Lua 位元組碼。有幾個相關函數。loadfile
[2] 函數類似,但會從指定檔案系統路徑的檔案取得其碼。loadstring
和 loadfile
都是高層級函數,以低層級的 load
函數碼來實作。load
[3] 函數會針對零個或多個分離取得的子字串組合建立一個 Lua 函數。當碼很大且逐漸讀取時(例如以區塊方式讀取檔案時),load
會比 loadstring
更有效率,因為它 необязательно 會將整個原始碼字串儲存在記憶體中,而只有位元組碼。
dofile
[4] 會執行 loadfile
並執行函數。
package.loadlib
[5] 函數會建立一個 Lua 函數,將原生碼封裝到指定動態載入的共用函式庫 [6] 的指定符號名稱(以 OS 特定的方式搜尋相對路徑 [6][7][8])。這特別允許在執行時動態載入非 Lua 的碼。
package.loaders
[9] 陣列中包含搜尋函數 [9](它本應命名為 package.searchers
packa [15])。搜尋函數可協助根據傳遞給搜尋函數的套件名稱 [10] 來建立 Lua 函數。其中一個搜尋函數實作於 loadfile
。另外兩個搜尋函數實作於 package.loadlib
。另一個不使用任一函數,而是傳回記憶體中預先快取的 Lua 函數。您也可加入自己的搜尋函數(例如,從 ZIP 檔案載入或從網路下載)。
只有儲存在檔案系統中的區塊才能將套件名稱對應到檔案系統路徑。這是經由 package.path
[11] 和 package.cpath
[12] 變數來定義。此對應預計將在 LuaFiveTwo 中公開為函數 package.searchpath
。通常,套件名稱不必採用慣例形式(例如 URL 或 GUID),只要有搜尋函數了解即可。
require
[13] 函數會傳回儲存在 package.loaded
[14] 表格中、以指定套件名稱為索引快取的值。如果該值不存在,它會循序呼叫 package.loaders
中的搜尋器函數,取得模組的載入器函數,將載入器函數當成參數呼叫,同時將套件名稱傳遞給載入器函數,將傳回值儲存在 package.loaded
中,並傳回該值。
請注意,模組載入是載入函數的特殊案例。你可以使用 package.loaders
載入的程式碼不需要依 Lua 模組的定義使用。對於模組而言,require
函數也不需要使用 module
函數。
require
函數的基本運作方式,實作自訂搜尋器 (libtcc),並指出可以實作的各種其他搜尋器。