第一版是為 Lua 5.0 編寫的,雖然在較新版本中仍有很大的相關性,但有些地方有所不同。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買本書,您也可以協助 贊助 Lua 專案。
![]() |
用 Lua 程式設計 | ![]() |
第四部分。C API 第 25 章。擴充您的應用程式 |
Lua 的一個重要用途是作為設定檔語言。在本章中,我們將說明如何使用 Lua 設定程式,從一個簡單的範例開始,然後逐漸演進到執行更複雜的任務。
作為我們的首要任務,讓我們想像一個簡單的設定檔範例:您的 C 程式(我們稱之為 pp
)有一個視窗,您希望使用者能夠指定視窗的初始大小。顯然,對於如此簡單的任務,有許多比使用 Lua 更簡單的選項,例如環境變數或包含名稱值對的檔案。但即使使用一個簡單的文字檔,您也必須以某種方式剖析它;因此,您決定使用 Lua 設定檔(也就是一個碰巧是 Lua 程式的純文字檔)。在最簡單的形式中,這個檔案可以包含類似以下的程式碼
-- configuration file for program `pp' -- define window size width = 200 height = 300
現在,您必須使用 Lua API 指示 Lua 剖析這個檔案,然後取得全域變數 width
和 height
的值。下列函式可以完成這項工作
#include <lua.h> #include <lauxlib.h> #include <lualib.h> void load (char *filename, int *width, int *height) { lua_State *L = lua_open(); luaopen_base(L); luaopen_io(L); luaopen_string(L); luaopen_math(L); if (luaL_loadfile(L, filename) || lua_pcall(L, 0, 0, 0)) error(L, "cannot run configuration file: %s", lua_tostring(L, -1)); lua_getglobal(L, "width"); lua_getglobal(L, "height"); if (!lua_isnumber(L, -2)) error(L, "`width' should be a number\n"); if (!lua_isnumber(L, -1)) error(L, "`height' should be a number\n"); *width = (int)lua_tonumber(L, -2); *height = (int)lua_tonumber(L, -1); lua_close(L); }首先,它開啟 Lua 套件並載入標準函式庫(這些函式庫是選用的,但通常建議使用)。然後,它使用
luaL_loadfile
從檔案 filename
載入區塊,並呼叫 lua_pcall
來執行它。如果這些函式中出現任何錯誤(例如,設定檔中的語法錯誤),呼叫會傳回一個非零錯誤碼,並將錯誤訊息推入堆疊中。我們的程式照常使用索引值-1 的 lua_tostring
從堆疊頂端取得訊息。(我們在 第 24.1 節 中定義了 error
函式。)
執行區塊後,程式需要取得全域變數的值。為此,它呼叫了兩次 lua_getglobal
,其單一參數(除了無所不在的 lua_State
)是變數名稱。每個呼叫都會將對應的全域值推送到堆疊的頂端,因此寬度將位於索引 -2,而高度位於索引 -1(在頂端)。(因為堆疊先前是空的,所以您也可以從底部索引,從第一個值使用 1,從第二個值使用 2。然而,從頂端索引,即使堆疊不為空,您的程式碼也會運作。)接下來,我們的範例使用 lua_isnumber
檢查每個值是否為數字。然後它使用 lua_tonumber
將這些值轉換為 double
,而 C 會強制轉換為 int
。最後,它關閉 Lua 狀態並傳回。
使用 Lua 值得嗎?正如我先前所說,對於如此簡單的任務,只包含兩個數字的簡單檔案會比 Lua 容易使用許多。即便如此,使用 Lua 還是帶來了一些優點。首先,Lua 會為您處理所有語法細節(和錯誤);您的組態檔甚至可以有註解!其次,使用者已經能夠使用它來進行更複雜的組態。例如,腳本可能會提示使用者提供一些資訊,或者它可以查詢環境變數來選擇適當的大小
-- configuration file for program `pp' if getenv("DISPLAY") == ":0.0" then width = 300; height = 300 else width = 200; height = 200 end即使在如此簡單的組態場景中,也很難預測使用者想要什麼;但只要腳本定義了這兩個變數,您的 C 應用程式就可以在不變更的情況下運作。
使用 Lua 的最後一個原因是,現在可以輕鬆地為您的程式新增新的組態功能;這種容易性會創造出一個態度,導致程式更具彈性。
版權所有 © 2003–2004 Roberto Ierusalimschy。保留所有權利。 | ![]() |