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


27.3.1 – 註冊表

註冊表總是位於 偽索引 中,其值由 LUA_REGISTRYINDEX 定義。偽索引類似於堆疊中的索引,但其關聯值不在堆疊中。Lua API 中大多數接受索引作為引數的函式也接受偽索引,但操作堆疊本身的函式(例如 lua_removelua_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 節 中更詳細地討論輕量級使用者資料。

當然,也可以使用字串作為註冊表的金鑰,只要選擇唯一的名稱即可。當您希望允許其他獨立函式庫存取您的資料時,字串金鑰特別有用,因為它們只需要知道金鑰名稱即可。對於此類金鑰,沒有防呆的名稱選取方法,但有一些良好的做法,例如避免使用常見名稱,並以函式庫名稱或類似名稱為您的名稱加上前綴。lualualib 等前綴不是好的選擇。另一個選項是使用 通用唯一識別碼 (uuid),因為現在大多數系統都有產生此類識別碼的程式(例如 Linux 中的 uuidgen)。uuid 是一個 128 位元數字(以十六進位寫入以形成字串),由主機 IP 位址、時間戳記和隨機組成部分組合產生,因此它必定與任何其他 uuid 不同。