第一版是針對 Lua 5.0 編寫的。儘管對後續版本仍有很大的關聯性,但仍有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買本書,您也協助 支援 Lua 專案


27.3.2 – 參照

您不應在註冊表中使用數字作為鍵,因為此類鍵是保留給參照系統的。此系統由輔助函式庫中的兩個函式組成,可讓您將值儲存在註冊表中,而不必擔心如何建立唯一名稱。(實際上,這些函式可用於任何資料表,但通常與註冊表一起使用。)

呼叫

    int r = luaL_ref(L, LUA_REGISTRYINDEX);
會從堆疊中彈出一個值,將其儲存在註冊表中,並使用新的整數鍵,然後傳回該鍵。我們稱此鍵為參照

顧名思義,我們主要在需要將對 Lua 值的參照儲存在 C 結構中時使用參照。正如我們所見,我們不應將指標儲存在 C 函式以外的 Lua 字串中。此外,Lua 甚至不提供指標指向其他物件,例如資料表或函式。因此,我們無法透過指標參照 Lua 物件。相反,當我們需要此類指標時,我們會建立一個參照並將其儲存在 C 中。

若要將與參照 r 關聯的值推入堆疊,我們只需撰寫

    lua_rawgeti(L, LUA_REGISTRYINDEX, r);
最後,若要釋放值和參照,我們呼叫
    luaL_unref(L, LUA_REGISTRYINDEX, r);
呼叫後,luaL_ref 可能會再次傳回 r 中的值作為新的參照。

參照系統將nil視為特殊情況。每當您對 nil 值呼叫 luaL_ref 時,它不會建立新的參照,而是傳回常數參照 LUA_REFNIL。呼叫

    luaL_unref(L, LUA_REGISTRYINDEX, LUA_REFNIL);
沒有作用,而
    lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_REFNIL);
會推入一個nil,正如預期。

參照系統也定義了常數 LUA_NOREF,它是一個與任何有效參照都不同的整數。它可協助將參照標記為無效。與 LUA_REFNIL 一樣,任何嘗試擷取 LUA_NOREF 的動作都會傳回nil,而任何嘗試釋放它的動作都沒有作用。