Ссылка на функцию Lua в C / C ++ - PullRequest
13 голосов
/ 13 сентября 2009

У меня есть функции, глубоко вложенные в набор таблиц. Есть ли в C / C ++ способ получить «ссылку» на эту функцию и поместить ее (и аргументы) в стек, когда мне нужно ее использовать?

Ответы [ 2 ]

21 голосов
/ 13 сентября 2009

Для этого предназначена справочная система . Вызов функции r = luaL_ref(L, LUA_REGISTRYINDEX) сохраняет значение в верхней части стека в реестре и возвращает целое число, которое можно сохранить на стороне C и использовать для получения значения с помощью вызова функции lua_rawgeti(L, LUA_REGISTRYINDEX, r).

См. Главу PiL , а также документацию luaL_ref(), lua_rawgeti() и luaL_unref() для полной истории.

2 голосов
/ 13 сентября 2009

Lua API (http://www.lua.org/manual/5.1/manual.html#3) можно использовать для доступа к любым элементам таблицы, которые вы хотите. Используйте lua_gettable (), чтобы извлечь элемент таблицы и поместить его в стек lua, если этот элемент также является таблицей, просто вызовитеlua_gettable () снова, чтобы получить доступ к этой таблице, и так далее ...

(В зависимости от того, что вы делаете, lua_rawget () может быть лучшим выбором, чем lua_gettable ())

Add add inответ на комментарий:

Хорошо, это немного интереснее. Ну, таблица - это ссылочный объект (более или менее), так что вы, вероятно, можете безопасно сохранить внутреннюю ссылку на таблицу где-нибудь.

Поскольку у lua API, похоже, нет возможности напрямую манипулировать ссылочными ссылочными таблицами, вам, вероятно, придется перенести ссылочную ссылку в глобальную переменную, или если это не сработает в новой таблице с одной записью таблицы.Я хочу получить ссылку позже, просто получи ее от глобального.

Например

// Final table reference is now at top of stack, after multiple dereferences
lua_setglobal( L, "mytableref" );
...