私はこの主題を調査し、さまざまなアプローチを試みましたが、私が考えている動作を実装することはできません (それが可能かどうかさえわかりません)。基本的に、次のように、メタテーブルからアクセスできる C で作成されたいくつかのユーザーデータ オブジェクトがあります。
Main.lua
config.display_width = 1280
私がやりたいのは、構成名前空間を特定のスクリプトに「強制」することです。ご想像のとおり、ユーザーが構成メタテーブルのみを扱うように制限されるように、構成ファイルを保護する必要があります。このような:
Config.lua
display_width = 1280
そして、私はCで次のようなことをしなければならないことを知っています:
// Register the config metatable and its methods
luaL_loadfile(L, "my_config.cfg");
lua_getglobal(L, "config"); // Is this necessary?
lua_setfenv(L, -2); // I know this has to be used, but how?
lua_pcall(L, 0, 0, 0);
前もってありがとう、これは私を夢中にさせています!
PS: 記録のために、C 構造にバインドされているため、構成ユーザーデータをそのままにしておく必要があります。結果として、異なる環境間で Lua の状態や宣言された変数が「失われる」ことについては心配していません。
以下の情報を追加します。これは、構成ユーザーデータの作成方法です。
const struct luaL_Reg metaconfig[] =
{
{"__index", l_get},
{"__newindex", l_set},
{NULL, NULL}
};
lua_newuserdata(L, sizeof(void *));
luaL_newmetatable(L, "metaconfig");
luaL_register(L, NULL, metaconfig);
lua_setmetatable(L, -2);
lua_setglobal(L, "config");
したがって、ユーザーが構成ユーザーデータから値を設定または取得するたびに、__index
または__newindex
メソッドを介して C 構造を更新します。