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

在Lua中,如何打印当前函数的名称,如C99 __函数标识符?,lua,Lua,大概是这样的: function foo() print( __func__ ) ... end 如何做到这一点?使用。它提供了一个getinfo(func)函数,该函数返回一个包含函数信息的表 你不能。在lua中,函数是第一类变量。所以他们没有名字。你不妨问“2的名字是什么”。仅仅因为某个变量被赋值为“2”,并不能使该变量成为2的名称。同样,“someFunc”是一个变量,可能是许多变量中的一个,它包含一个特定的函数。虽然我同意,但该代码并不总是报告Chris Becke指出的

大概是这样的:

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

如何做到这一点?

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

你不能。在lua中,函数是第一类变量。所以他们没有名字。你不妨问“2的名字是什么”。仅仅因为某个变量被赋值为“2”,并不能使该变量成为2的名称。同样,“someFunc”是一个变量,可能是许多变量中的一个,它包含一个特定的函数。

虽然我同意,但该代码并不总是报告Chris Becke指出的相同名称。当函数被分配给另一个变量时,“名称”将被更改

#!/usr/bin/lua

local function myFunc()
 print(debug.getinfo(1, "n").name);
end
myFunc()
这是另一种选择。它只使用一个字符串来标识函数。此方法解决了更改名称的问题,但引入了维护问题。在将来的重构中,字符串需要与函数名保持同步

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

如果
\uuuuu func\uuuuuu>看起来更好,并且标准Lua并不重要,那么可以按原样修改Lua解析器。

函数不一定有它们。在Lua中,创建没有名字的匿名函数并调用它是完全合法的,而不给它分配名字

(function()
    print("in anonymous function!")
end)()
这是完全正确的Lua。您想给该函数取什么名称?

您可以尝试:

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" <<--- See here the function name
Info["nparams"] = 4
local dbFunc=debug.getinfo(1)和debug.getinfo(1)。名称或“”
信息
信息[“当前线路”]=1376
信息[“源”]=“@.\mymod.lua”
信息[“short\u src”]=“\mymod.lua”
信息[“nups”]=13
信息[“isvararg”]=false
信息[“什么”]=“Lua”
信息[“lastlinedefined”]=1570
信息[“func”]=函数:0000000000 30B440
信息[“istailcall”]=错误
信息[“linedefined”]=1375
信息[“名称内容”]=“字段”
信息[“名称”]=“导出数据库”
输出:

第8行,文件@./andydebug.lua,在func:printlinefilefunc中


你想要实现什么?请参阅本文了解我想要实现的内容:)在stacktraces中,这些函数显示为
,其中$LINE是函数出现的行。次要说明(是的,我知道这是一个旧线程):使用
debug.getinfo(1)或“
将与
debug.getinfo(1)和debug.getinfo(1)或“
的工作原理相同
你知道的时候为什么投了反对票。我只是想帮你??!!1) 这是两年半以前的事了。2) 我没有投反对票,其他人投了。你的答案与公认的答案如何一致?没有。两个答案在技术上都是正确的。如果-按名称-您想要lua函数的唯一不变的指定名称-FUNC为C程序提供的名称-您将无法获得它。如果通过名称,您只需要函数作为其值的变量的名称,请使用调试方法获得该名称,记住可以重新分配变量,并且多个变量可以包含相同的值-因此,以这种方式返回的“名称”既不是唯一的,也不是不变的。在Lua中,函数不是变量。一等公民不是阻止访问其姓名的有效理由。例如,在Python中,您可以通过
myFunc.\uu\u name\uu
访问它。在JavaScript中,它应该是
myFunc.name
。但在C语言中,链接之后,函数名对您来说并没有任何意义。我们都知道Python和JavaScript支持第一类函数,但不支持C。这取决于lua解释器/版本。source为我提供了.lua脚本的全部源代码。在lua5.3中,它当前返回“nil”。
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