此第一版是針對 Lua 5.0 編寫的。雖然在很大程度上仍然適用於後續版本,但仍有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買本書,您也可以協助 支援 Lua 專案


8.1 – require 函式

Lua 提供一個較高層級的函式來載入和執行函式庫,稱為 require。大致來說,require 的工作與 dofile 相同,但有兩個重要的差異。首先,require 會在路徑中搜尋檔案;其次,require 會控制檔案是否已執行,以避免重複工作。由於這些功能,require 是 Lua 中用於載入函式庫的首選函式。

require 使用的路徑與一般路徑稍有不同。大多數程式會將路徑用作目錄清單,用於搜尋特定檔案。然而,ANSI C(Lua 執行的抽象平台)沒有目錄的概念。因此,require 使用的路徑是一個模式清單,每個模式都指定將虛擬檔名(require 的引數)轉換為實際檔名的替代方式。更具體地說,路徑中的每個元件都是包含選用問號的檔名。對於每個元件,require 會將每個 `?´ 替換為虛擬檔名,並檢查是否有該名稱的檔案;如果沒有,它會前往下一個元件。路徑中的元件以分號分隔(在大多數作業系統中,分號很少用於檔名)。例如,如果路徑是

    ?;?.lua;c:\windows\?;/usr/local/lua/?/?.lua
則呼叫 require"lili" 會嘗試開啟下列檔案
    lili
    lili.lua
    c:\windows\lili
    /usr/local/lua/lili/lili.lua
require 唯一修正的是分號(作為元件分隔符)和問號;其他所有內容(例如目錄分隔符或檔案副檔名)都在路徑中定義。

為了確定其路徑,require 會先檢查全域變數 LUA_PATH。如果 LUA_PATH 的值是字串,則該字串就是路徑。否則,require 會檢查環境變數 LUA_PATH。最後,如果兩次檢查都失敗,require 會使用固定路徑(通常為 "?;?.lua",雖然在編譯 Lua 時很容易變更)。

require 的另一個主要工作是避免重複載入同一個檔案。為此,它會保留一個表格,其中包含所有已載入檔案的名稱。如果一個必要的檔案已經在表格中,require 只會回傳。表格保留已載入檔案的虛擬名稱,而不是它們的實際名稱。因此,如果您使用兩個不同的虛擬名稱載入同一個檔案,它將會被載入兩次。例如,命令 require"foo" 接著 require"foo.lua",路徑為 "?;?.lua",將會載入檔案 foo.lua 兩次。您可以透過全域變數 _LOADED 存取此控制表格。使用這個表格,您可以檢查哪些檔案已經被載入;您也可以欺騙 require 執行一個檔案兩次。例如,在成功的 require"foo" 之後,_LOADED["foo"] 將不會是 nil。如果您接著將 nil 指定給 _LOADED["foo"],後續的 require"foo" 將會再次執行該檔案。

一個元件不需要有問號;它可以是一個固定的檔案名稱,例如以下路徑中的最後一個元件

    ?;?.lua;/usr/local/default.lua
在這種情況下,每當 require 找不到其他選項時,它將會執行這個固定的檔案。(當然,只有將一個固定的元件作為路徑中的最後一個元件才有意義。)在 require 執行一個區塊之前,它會定義一個全域變數 _REQUIREDNAME,其中包含要載入檔案的虛擬名稱。我們可以使用這些功能來擴充 require 的功能。在一個極端的例子中,我們可以將路徑設定為類似 "/usr/local/lua/newrequire.lua" 的東西,這樣每次呼叫 require 都會執行 newrequire.lua,然後它可以使用 _REQUIREDNAME 的值來實際載入必要的檔案。