第一版是針對 Lua 5.0 編寫的。儘管對後續版本仍有很大的關聯性,但仍有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買本書,您也協助 支援 Lua 專案。
![]() |
用 Lua 編寫程式 | ![]() |
第四部分。C API 第 27 章。撰寫 C 函式的技巧 |
您不應在註冊表中使用數字作為鍵,因為此類鍵是保留給參照系統的。此系統由輔助函式庫中的兩個函式組成,可讓您將值儲存在註冊表中,而不必擔心如何建立唯一名稱。(實際上,這些函式可用於任何資料表,但通常與註冊表一起使用。)
呼叫
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,而任何嘗試釋放它的動作都沒有作用。
版權所有 © 2003–2004 Roberto Ierusalimschy。保留所有權利。 | ![]() |