Ссылка на функцию Lua в C/C++
-
06-07-2019 - |
Вопрос
У меня есть функции, вложенные относительно глубоко в набор таблиц.Есть ли в C/C++ способ получить «ссылку» на эту функцию и поместить ее (и аргументы) в стек, когда мне нужно ее использовать?
Решение
Именно для этого предназначена справочная система . Вызов функции r = luaL_ref (L, LUA_REGISTRYINDEX)
сохраняет значение в верхней части стека в реестре и возвращает целое число, которое можно сохранить на стороне C и использовать для извлечения значения с помощью вызов функции lua_rawgeti (L, LUA_REGISTRYINDEX, r)
.
См. главу PiL , а также документацию по luaL_ref ()
, lua_rawgeti ()
и luaL_unref ()
для полной истории.
Другие советы
API Луа (http://www.lua.org/manual/5.1/manual.html#3) можно использовать для доступа к любым элементам таблицы, которые вы хотите.Используйте lua_gettable(), чтобы извлечь элемент таблицы и поместить его в стек Lua. Если этот элемент также является таблицей, просто вызовите lua_gettable() еще раз, чтобы получить доступ к этой таблице, и так далее...
(В зависимости от того, что вы делаете, lua_rawget() может быть лучшим выбором, чем lua_gettable() )
Дополнительно в ответ на комментарий:
Хорошо, это немного интереснее.Ну, таблица — это ссылочный объект (в большей или меньшей степени), поэтому вам, вероятно, будет безопасно сохранить где-нибудь самую внутреннюю ссылку на таблицу.
Поскольку API lua, похоже, не имеет возможности напрямую манипулировать ссылками на таблицы, вам, вероятно, придется поместить ссылку в глобальную таблицу, или, если это не работает, новую таблицу с одной записью таблицы.Если вам понадобится ссылка позже, просто получите ее из глобального каталога.
например
// Final table reference is now at top of stack, after multiple dereferences
lua_setglobal( L, "mytableref" );