Зачем существует registry в lua?

В общем суть вопроса такая, есть функция debug.getregistry(). Функция возвращает таблицу, вопрос в следующем, какую роль играет эта таблица в интерпретаторе?
  • Вопрос задан
  • 320 просмотров
Пригласить эксперта
Ответы на вопрос 2
@q27off
Некоторые абстракции данных невозможно хранить в C-коде в чистом виде. - Их реализации "скрыты" за луашным API. К таким данным относятся, наприер, lua-таблицы.

В типичном случае таблица по индексу LUA_REGISTRYINDEX используется для хранения метатаблиц пользовательских библиотек. Например, во время инициализации библиотеки создается метатаблица:

luaL_newmetatable(L, LIBNAME); // создаем метатаблицу на стэке
// ... - какой-то код, наполняющий созданную таблицу
lua_rawsetp(L, LUA_REGISTRYINDEX, (void*)METAKEY); // устанавливаем метатаблицу по уникальному ключу


Затем, при генерации нового библиотечного объекта, ему устанавливается ранее созданная метатаблица:

int object_new(lua_State *L)
{
    char *ud = lua_newuserdata(L, UDSIZE); // создаем новый объект
    lua_rawgetp(L, LUA_REGISTRYINDEX, (void *)METAKEY); // извлекаем ранее созданную метатаблицу
    lua_setmetatable(L, -2); // устанавливаем метатаблицу для созданного объекта
    return 1;
}
Ответ написан
Комментировать
@zedxxx
Об этом подробно написано в документации: https://www.lua.org/manual/5.3/manual.html#4.5

Lua предоставляет реестр, предопределенную таблицу, которая доступна C коду для хранения любых Lua значений. Таблица рееста всегда расположена по псевдоидексу LUA_REGISTRYINDEX. Любая C библиотека может хранить данные в этой таблице, но она должна заботиться о выборе уникальных ключей, чтобы избежать коллизий с другими библиотеками. Обычно, вы должны использовать в качестве ключа строку содержащую имя библиотеки, или легкие пользовательские данные (light userdata) с адресом C объекта в вашем коде, или любой Lua объект созданный вашим кодом. Как и имена переменных, ключи, начинающиеся с подчеркивания со следующими за ним прописными буквами, зарезервированы для Lua.

Целочисленные ключи в реестре используются механизмом ссылок (см. luaL_ref) и некоторыми предопределенными значениями. Следовательно, целочисленные ключи не должны использоваться для других целей.

Когда вы создаете новый Lua контекст, его реестр содержит некоторые предопределенные значения. Эти предопределенные значения индексируются целочисленными ключами, определенными как константы в lua.h. Определены следующие константы:

  • LUA_RIDX_MAINTHREAD: По этому индексу в реестре расположен главный поток контекста. (Главный поток создается при создании контекста.)
  • LUA_RIDX_GLOBALS: По этому индексу в реестре расположено глобальное окружение.


Так же, есть небольшой пример использования в Programming in Lua: https://www.lua.org/pil/27.3.1.html
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы