假设已为即将进行的函数调用(使用lua_pcall()
)设置了Lua堆栈。
为使事情具体,让我们假设函数采用一个字符串参数,并且堆栈在函数下方不包含任何其他Lua对象。也就是说,堆栈看起来像这样:
Lua stack at 1 = a LUA_TFUNCTION
Lua stack at 2 = a LUA_TSTRING
如何从这样的堆栈中获取函数的名称?
我尝试了lua_tostring()
和luaL_getmetafield()
(使用e
= "__name"
),但是这些功能不适用于此目的。
答案 0 :(得分:6)
从最一般的意义上讲,函数没有名称。它们是价值,就像其他任何价值一样。在一个实例中用于访问功能的名称不必与在另一个实例中使用的名称相匹配,因为您可以在其中复制功能。
但是,Lua编译器确实会认识到,如果您使用形式为function <name>(...) end
的语句创建函数,则<name>
对正在创建的函数很重要。此名称纯粹用于调试目的(您可以通过C API中的lua_getinfo
获取此函数的“名称”),因此不能保证可以在以下语言中使用该名称:查找/访问此功能的任何实际意义。
答案 1 :(得分:5)
Lua值(函数只是一个值,如数字)没有名称。
您在堆栈上找到的函数值是表达式求值的结果,它可能涉及读取某些变量(可能您认为这是函数的名称)或就地构造新函数。在堆栈上,您可以获得表达式的结果,而可能根本不知道读取了哪个变量。
如果确实需要与该函数关联一些唯一的名称,则必须在自己的表中跟踪这些名称/ id,这些名称/ id可从本机侧访问。然后您可以轻松地通过函数值查找名称。
如果这不是您的代码,但是您仍然需要区分函数,则可以尝试自己构建该查找表,从而迭代要监视的环境。如果环境是动态更新的,那仍然会失败。相同的变量以后可以存储任何其他函数。
但是在一般情况下-忘记名称,因为值没有名称。