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

时间:2010-10-26 08:17:37

标签: lua

这样的事情:

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

怎么做?

6 个答案:

答案 0 :(得分:27)

#!/usr/bin/lua

local function myFunc()
 print(debug.getinfo(1, "n").name);
end
myFunc()

答案 1 :(得分:10)

你做不到。在lua中,函数是第一类变量。所以他们没有名字。你不妨问“2的名字是什么”。仅仅因为某个变量被赋值,值'2'就不会使该变量成为名称2.同样,“someFunc”是一个变量 - 可能是其中之一 - 保存一个特定的函数。

答案 2 :(得分:4)

虽然我同意Ephraim's answer,但该代码并不总是报告与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并不重要,那么Lua解析器可以在this example for __FILE__ and __LINE__中进行修改。

答案 3 :(得分:4)

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

输出:

  

第8行,FILE在@。/ andydebug.lua,在func:printlinefilefunc

答案 4 :(得分:3)

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

答案 5 :(得分:3)

功能不一定拥有它们。在Lua中创建没有名称的匿名函数并调用它是完全合法的,而不是指定它。

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

完全有效的Lua。你想用什么名字给这个功能?