加載碼的精髓

lua-users home
wiki

有各種方式可以在 Lua 中加載外部碼。以下說明這些方式之間的關係。

loadstring [1] 函數會針對指定的編譯後 Lua 位元組碼或 Lua 原始碼字串建立一個 Lua 函數,而 loadstring 會將 Lua 原始碼編譯為 Lua 位元組碼。有幾個相關函數。loadfile [2] 函數類似,但會從指定檔案系統路徑的檔案取得其碼。loadstringloadfile 都是高層級函數,以低層級的 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 函數。

另請參閱


最新變更 · 偏好設定
編輯 · 歷史記錄
最後編輯時間為 2009 年 5 月 2 日凌晨 2:33 GMT (diff)