第一版是針對 Lua 5.0 編寫的。雖然在很大程度上仍然適用於後續版本,但仍有一些差異。
第四版針對 Lua 5.3,可以在 Amazon 和其他書店購買。
購買本書也可以協助 支援 Lua 專案。
![]() |
Lua 中的 程式設計 | ![]() |
第四部分 C API 第 27 章 編寫 C 函式的技巧 |
註冊表總是位於 偽索引 中,其值由 LUA_REGISTRYINDEX
定義。偽索引類似於堆疊中的索引,但其關聯值不在堆疊中。Lua API 中大多數接受索引作為引數的函式也接受偽索引,但操作堆疊本身的函式(例如 lua_remove
和 lua_insert
)除外。例如,若要取得註冊表中儲存為金鑰 "Key"
的值,可以使用下列程式碼
lua_pushstring(L, "Key"); lua_gettable(L, LUA_REGISTRYINDEX);
註冊表是一個常規的 Lua 表格。因此,可以使用任何 Lua 值(但 nil 除外)作為其索引。然而,由於所有 C 函式庫共用同一個註冊表,因此必須謹慎選擇用作金鑰的值,以避免衝突。防呆的方法是使用程式碼中靜態變數的位址作為金鑰:C 連結編輯器可確保此金鑰在所有函式庫中都是唯一的。若要使用此選項,需要函式 lua_pushlightuserdata
,它會在 Lua 堆疊中推入一個表示 C 指標的值。下列程式碼顯示如何使用此方法在註冊表中儲存和擷取數字
/* variable with an unique address */ static const char Key = 'k'; /* store a number */ lua_pushlightuserdata(L, (void *)&Key); /* push address */ lua_pushnumber(L, myNumber); /* push value */ /* registry[&Key] = myNumber */ lua_settable(L, LUA_REGISTRYINDEX); /* retrieve a number */ lua_pushlightuserdata(L, (void *)&Key); /* push address */ lua_gettable(L, LUA_REGISTRYINDEX); /* retrieve value */ myNumber = lua_tonumber(L, -1); /* convert to number */我們將在 第 28.5 節 中更詳細地討論輕量級使用者資料。
當然,也可以使用字串作為註冊表的金鑰,只要選擇唯一的名稱即可。當您希望允許其他獨立函式庫存取您的資料時,字串金鑰特別有用,因為它們只需要知道金鑰名稱即可。對於此類金鑰,沒有防呆的名稱選取方法,但有一些良好的做法,例如避免使用常見名稱,並以函式庫名稱或類似名稱為您的名稱加上前綴。lua
或 lualib
等前綴不是好的選擇。另一個選項是使用 通用唯一識別碼 (uuid
),因為現在大多數系統都有產生此類識別碼的程式(例如 Linux 中的 uuidgen
)。uuid
是一個 128 位元數字(以十六進位寫入以形成字串),由主機 IP 位址、時間戳記和隨機組成部分組合產生,因此它必定與任何其他 uuid
不同。
版權所有 © 2003–2004 Roberto Ierusalimschy。保留所有權利。 | ![]() |