Я исследовал эту тему и пробовал различные подходы, но я не могу реализовать то поведение, которое имею в виду (я даже не уверен, что это возможно). По сути, у меня есть несколько объектов пользовательских данных, созданных на 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");
Поэтому каждый раз, когда пользователь устанавливает или получает значения из пользовательских данных конфигурации, я обновляю структуру C с помощью методов __index
или __newindex
.