此第一版是為 Lua 5.0 編寫的。雖然在很大程度上仍然適用於後續版本,但仍有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買本書,您還可以 支援 Lua 專案。
![]() |
程式設計 Lua | ![]() |
第四部分。C API 第 24 章。C API 概觀 |
為了參考堆疊中的元素,API 使用索引。堆疊中的第一個元素(即首先推入的元素)的索引為 1,下一個元素的索引為 2,依此類推。我們也可以使用堆疊頂端作為參考,使用負索引來存取元素。在這種情況下,-1 參考頂端的元素(即最後推入的元素),-2 參考前一個元素,依此類推。例如,呼叫 lua_tostring(L, -1)
會將堆疊頂端的數值傳回為字串。正如我們將看到的,有許多場合自然會從底部(即使用正索引)索引堆疊,還有許多其他場合自然會使用負索引。
為了檢查元素是否具有特定類型,API 提供了一系列 lua_is*
函式,其中 *
可以是任何 Lua 類型。因此,有 lua_isnumber
、lua_isstring
、lua_istable
等。所有這些函式都有相同的原型
int lua_is... (lua_State *L, int index);
lua_isnumber
和 lua_isstring
函式不檢查數值是否具有該特定類型,而是檢查數值是否可以轉換為該類型。例如,任何數字都滿足 lua_isstring
。
還有一個函式 lua_type
,它會傳回堆疊中元素的類型。(某些 lua_is*
函式實際上是使用此函式的巨集。)每個類型都由標頭檔案 lua.h
中定義的常數表示:LUA_TNIL
、LUA_TBOOLEAN
、LUA_TNUMBER
、LUA_TSTRING
、LUA_TTABLE
、LUA_TFUNCTION
、LUA_TUSERDATA
和 LUA_TTHREAD
。此函式主要與 switch 陳述式結合使用。當我們需要在沒有強制轉換的情況下檢查字串和數字時,它也很有用。
若要從堆疊中取得數值,可以使用 lua_to*
函式
int lua_toboolean (lua_State *L, int index); double lua_tonumber (lua_State *L, int index); const char *lua_tostring (lua_State *L, int index); size_t lua_strlen (lua_State *L, int index);即使給定的元素沒有正確的類型,呼叫它們也是可以的。在此情況下,
lua_toboolean
、lua_tonumber
和 lua_strlen
會傳回零,而其他則會傳回 NULL
。零沒有用,但 ANSI C 沒有提供無效的數值,我們可以使用它來發出錯誤訊號。然而,對於其他函式,我們經常不需要使用對應的 lua_is*
函式:我們只要呼叫 lua_to*
,然後測試結果是否不是 NULL
即可。
lua_tostring
函式會傳回一個指向字串內部拷貝的指標。您無法變更它(那裡有一個 const
來提醒您)。Lua 會確保此指標在對應的值在堆疊中時有效。當 C 函式傳回時,Lua 會清除其堆疊;因此,原則上,您絕不應該將指向 Lua 字串的指標儲存在取得它們的函式之外。
lua_tostring
傳回的任何字串其結尾永遠都有零,但其內部可能還有其他零。lua_strlen
函式會傳回字串的正確長度。特別是,假設堆疊頂端的數值是一個字串,則下列斷言永遠有效
const char *s = lua_tostring(L, -1); /* any Lua string */ size_t l = lua_strlen(L, -1); /* its length */ assert(s[l] == '\0'); assert(strlen(s) <= l);
版權所有 © 2003–2004 Roberto Ierusalimschy。保留所有權利。 | ![]() |