在Lua中,你如何打印当前函数的名称,就像C99的__func__标识符那样?

如何将其完成?

function foo()
    print( __func__ )
   ...
end

可以怎样做?

原文链接 https://stackoverflow.com/questions/4021816

点赞
stackoverflow用户251122
stackoverflow用户251122

使用 Debug Library。 它提供了一个getinfo(func)函数,返回有关函数的信息的表格。

2010-10-26 08:21:12
stackoverflow用户27491
stackoverflow用户27491

你做不到。在 Lua 中,函数是一种值,因此它们没有名字。你可能会问“2 的名字是什么”?只是因为某个变量被赋予了值“2”并不意味着该变量是“2”的名称。同样,“someFunc”是一个变量——可能是众多变量之一——它保存了一个特定函数。


根据评论中的 @Orouborus:

function f() end 只是 f = function () end 的语法糖。

无论你在做什么,无论其他帖子如何帮助你,你都可以打印出左边的东西“f”的名称,但无法打印出右边的东西的名称。

2010-10-26 08:22:32
stackoverflow用户59262
stackoverflow用户59262
#!/usr/bin/lua

本地函数myFunc()
 打印(debug.getinfo(1, "n").name);
end
myFunc()
2010-10-26 08:30:42
stackoverflow用户173806
stackoverflow用户173806

虽然我赞同 Ephraim 的答案,但正如 Chris Becke 指出的那样,该代码不总是报告相同的名称。当该函数分配给另一个变量时,“名称”会更改。

这里是另一个选择。它只使用字符串来标识函数。这种方法解决了名称更改的问题,但引入了维护问题。该字符串需要与未来重构中的函数名称保持同步。

function foo()
  local __func__ = "foo"
  print( __func__ )
  --...
end

或者,如果函数的位置比名称更重要,则以下方法可能更好。它将为基于源和行号的函数提供名称。

function getfunctionlocation()
  local w = debug.getinfo(2, "S")
  return w.short_src..":"..w.linedefined
end

function foo()
  print(getfunctionlocation()) --> foo.lua:6
  --...
end

如果 __func__ 仍然看起来更好,并且标准 Lua 不重要,则可以像 这个示例中的 __FILE____LINE__ 一样修改 Lua 解析器。

2010-10-27 19:53:27
stackoverflow用户298661
stackoverflow用户298661

函数并不一定需要名称。在 Lua 中创建匿名函数且不分配名称,并直接调用它是完全合法的。

(function()
    print("in anonymous function!")
end)()

这是完全有效的 Lua。你想给这个函数起什么名字?

2010-10-27 20:01:18
stackoverflow用户4170264
stackoverflow用户4170264

你可以尝试:

local dbFunc = debug.getinfo(1) and debug.getinfo(1).name or ""

Info
Info["currentline"] = 1376
Info["source"] = "@.\mymod.lua"
Info["short_src"] = ".\mymod.lua"
Info["nups"] = 13
Info["isvararg"] = false
Info["what"] = "Lua"
Info["lastlinedefined"] = 1570
Info["func"] = function: 000000000030B440
Info["istailcall"] = false
Info["linedefined"] = 1375
Info["namewhat"] = "field"
Info["name"] = "ExportDB" <<--- 这里是函数名
Info["nparams"] = 4

debug.getinfo(1) 返回当前执行状态下活动函数在栈中的结构。

如果 n 大于栈中活动函数的数量,debug.getinfo() 将返回 nil。

这就是为什么在获取 *.name 值之前需要检查它是否存在,并且如果信息不可用则返回空字符串。

由于它在 ExportDB() 函数内部调用,它返回该函数的名称。

2015-09-11 09:32:35
stackoverflow用户4344990
stackoverflow用户4344990
function __FILE__() return debug.getinfo(2, 'S').source end
function __LINE__() return debug.getinfo(2, 'l').currentline end
function __FUNC__() return debug.getinfo(2, 'n').name end

function printlinefilefunc()
    print("Line at "..__LINE__()..", FILE at "..__FILE__()..", in func: "..__FUNC__())
end

输出:

Line at 8, FILE at @./andydebug.lua, in func: printlinefilefunc

2016-11-24 02:39:16