Lua C API:如何获取函数名称?

use*_*866 2 lua

假设Lua堆栈已设置为即将进行的函数调用(with lua_pcall()).

为了使事情具体化,让我们假设该函数接受一个字符串参数,并且该堆栈不包含该函数下面的任何其他Lua对象.也就是说,堆栈看起来像这样:

Lua stack at 1 = a LUA_TFUNCTION
Lua stack at 2 = a LUA_TSTRING
Run Code Online (Sandbox Code Playgroud)

如何从这样的堆栈中获取函数的名称?

我试过了lua_tostring(),和luaL_getmetafield()(带e= "__name"),但这些功能不能用于此目的.

Nic*_*las 6

从一般意义上讲,函数没有名称.它们就像任何其他价值观一样.在一个实例中用于访问函数的名称不需要与在另一个实例中使用的名称匹配,因为您可以只复制函数.

但是,Lua编译器确实认识到如果使用表单语句创建函数function <name>(...) end,这<name>对正在创建的函数很重要.此名称用于调试目的(您可以通过lua_getinfoC API 获取函数的"名称" ),因此无法保证您可以在任何真正意义上使用此名称来查找/访问此函数.


Vla*_*lad 5

Lua值(函数只是一个值,就像一个数字)没有名字.

您在堆栈上找到的函数值是表达式求值的结果,可能涉及读取一些变量(可能您认为这是函数的名称),或者就地构造新函数.在堆栈上,你得到一个表达式的结果,而不知道哪个变量被读取,如果有的话.

如果您确实需要具有与该函数关联的一些唯一名称,则必须在自己的表中跟踪这些名称/ ID,可以从本机端访问.然后,您可以通过函数值轻松查找名称.

如果它不是您的代码,但仍需要区分功能,您可以尝试自己构建该查找表,迭代您要监视的环境.如果环境动态更新,那仍然会失败.同一变量可以在以后存储任何其他函数.

但一般情况下 - 忘记名称,因为值没有名称.