Lua C API: как получить имя функции? - PullRequest
0 голосов
/ 28 сентября 2018

Предположим, что стек Lua настроен для предстоящего вызова функции (с lua_pcall()).

Чтобы конкретизировать, давайте предположим, что функция принимает один строковый аргумент, и что стек не содержит никакихдругие объекты Lua ниже функции.То есть стек будет выглядеть так:

Lua stack at 1 = a LUA_TFUNCTION
Lua stack at 2 = a LUA_TSTRING

Как можно получить имя функции из такого стека?

Я пробовал lua_tostring() и luaL_getmetafield()e = "__name"), но эти функции не работают для этой цели.

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Говоря в самом общем смысле, функции не имеют имен.Это ценности, как и любые другие.Имя, которое вы используете для доступа к функции в одном экземпляре, не обязательно должно совпадать с именем, которое вы используете в другом, поскольку вы можете просто скопировать функции вокруг.

Однако , компилятор Lua распознает, чтоесли вы создаете функцию с оператором вида function <name>(...) end, то <name> важна для создаваемой функции.Это имя используется чисто для целей отладки (вы можете получить это «имя» функции через lua_getinfo в C API), поэтому нет гарантии, что вы можете использовать это имя в любом реальном смысле.найти / получить доступ к этой функции.

0 голосов
/ 28 сентября 2018

Значения Lua (функция - это просто значение, похожее на число) не имеет имен.

Значение функции, которое вы находите в стеке, является результатом вычисления выражения, которое может включать чтение некоторой переменной (и, возможно,вы думаете, что это имя функции) или создаете новую функцию на месте.В стеке вы получаете результат выражения, не зная, какая переменная была прочитана, если вообще существует.

Если вам действительно нужно иметь какое-то уникальное имя, связанное с функцией, вы должны отслеживать эти имена / идентификаторыв вашей собственной таблице, доступной с родной стороны.Тогда вы можете легко найти имя по значению функции.

Если это не ваш код, но вам все равно нужно различать функции, вы можете попытаться создать эту таблицу поиска самостоятельно, выполняя итерацию среды, которую вы хотите отслеживать,Это все еще может потерпеть неудачу, если среда динамически обновляется.Эта же переменная может хранить любую другую функцию позже.

Но в общем случае - забудьте об именах, так как у значений нет имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...