【问题标题】:Lua C API: How to get a function name?Lua C API:如何获取函数名?
【发布时间】:2019-03-04 06:26:57
【问题描述】:

假设为即将到来的函数调用(lua_pcall())设置了 Lua 堆栈。

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

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

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

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

【问题讨论】:

  • Lua 中的函数是匿名的。
  • @lhf 要清楚,他们可以是匿名的,你的意思是他们是一流的对象。
  • @val,我的意思是 Lua 中的函数无需指定名称即可存在。

标签: lua


【解决方案1】:

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

然而,Lua 编译器确实认识到,如果您使用function <name>(...) end 形式的语句创建一个函数,那么<name> 对正在创建的函数很重要。此名称​​纯粹用于调试目的(您可以通过 C API 中的lua_getinfo 获取函数的此“名称”),因此无法保证您可以在任何实际应用中使用此名称感觉找到/访问这个功能。

【讨论】:

    【解决方案2】:

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

    您在堆栈上找到的函数值是表达式评估的结果,这可能涉及读取一些变量(并且可能您认为这是一个函数的名称),或者就地构造新函数。在堆栈上,您会得到表达式的结果,但可能根本不知道读取了哪个变量(如果有的话)。

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

    如果不是你的代码,但你仍然需要区分函数,你可以尝试自己构建那个查找表,迭代你想要监控的环境。如果环境是动态更新的,那仍然会失败。同一个变量以后可以存储任何其他函数。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-19
      • 2017-01-12
      • 2021-06-13
      • 1970-01-01
      • 2013-10-27
      • 2016-01-04
      • 2018-12-06
      • 2016-06-13
      相关资源
      最近更新 更多