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


24.2.2 – 查詢元素

為了參考堆疊中的元素,API 使用索引。堆疊中的第一個元素(即首先推入的元素)的索引為 1,下一個元素的索引為 2,依此類推。我們也可以使用堆疊頂端作為參考,使用負索引來存取元素。在這種情況下,-1 參考頂端的元素(即最後推入的元素),-2 參考前一個元素,依此類推。例如,呼叫 lua_tostring(L, -1) 會將堆疊頂端的數值傳回為字串。正如我們將看到的,有許多場合自然會從底部(即使用正索引)索引堆疊,還有許多其他場合自然會使用負索引。

為了檢查元素是否具有特定類型,API 提供了一系列 lua_is* 函式,其中 * 可以是任何 Lua 類型。因此,有 lua_isnumberlua_isstringlua_istable 等。所有這些函式都有相同的原型

    int lua_is... (lua_State *L, int index);
lua_isnumberlua_isstring 函式不檢查數值是否具有該特定類型,而是檢查數值是否可以轉換為該類型。例如,任何數字都滿足 lua_isstring

還有一個函式 lua_type,它會傳回堆疊中元素的類型。(某些 lua_is* 函式實際上是使用此函式的巨集。)每個類型都由標頭檔案 lua.h 中定義的常數表示:LUA_TNILLUA_TBOOLEANLUA_TNUMBERLUA_TSTRINGLUA_TTABLELUA_TFUNCTIONLUA_TUSERDATALUA_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_tobooleanlua_tonumberlua_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);