この初版は Lua 5.0 向けに書かれました。以後のバージョンにも概ね関連しますが、若干異なる部分があります。
第 4 版は 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 テーブルです。そのため、nil 以外の Lua 値でインデックスを作成できます。ただし、すべての C ライブラリが同じレジストリを共有するため、キーとして使用する値は、衝突を避けるために慎重に選択する必要があります。確実な方法は、コード内の静的変数のアドレスをキーとして使用することです。C リンクエディタは、このキーがすべてのライブラリ間で一意になるようにします。このオプションを使用するには、Lua スタックに C ポインタを表す値をプッシュする lua_pushlightuserdata 関数が必要です。次のコードは、この方法を使用してレジストリから数値を格納および取得する方法を示しています

    /* 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 といったプレフィックスは適切な選択肢ではありません。別のオプションとして、universally unique identifier (uuid) を使用できます。ほとんどのシステムには現在、そのような識別子 (たとえば Linux の uuidgen) を生成するプログラムがあります。uuid は 128 ビットの数値 (16 進数で書き込まれて文字列を形成) で、ホストの IP アドレス、タイムスタンプ、ランダムコンポーネントを組み合わせて生成されます。そのため、他の uuid とは確実に異なります。