在Lua中,你如何打印当前函数的名称,就像C99的__func__标识符那样?
如何将其完成?
function foo()
print( __func__ )
...
end
可以怎样做?
原文链接 https://stackoverflow.com/questions/4021816
你做不到。在 Lua 中,函数是一种值,因此它们没有名字。你可能会问“2 的名字是什么”?只是因为某个变量被赋予了值“2”并不意味着该变量是“2”的名称。同样,“someFunc”是一个变量——可能是众多变量之一——它保存了一个特定函数。
根据评论中的 @Orouborus:
function f() end
只是 f = function () end
的语法糖。
无论你在做什么,无论其他帖子如何帮助你,你都可以打印出左边的东西“f”的名称,但无法打印出右边的东西的名称。
#!/usr/bin/lua
本地函数myFunc()
打印(debug.getinfo(1, "n").name);
end
myFunc()
虽然我赞同 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 解析器。
函数并不一定需要名称。在 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" <<--- 这里是函数名
Info["nparams"] = 4
debug.getinfo(1)
返回当前执行状态下活动函数在栈中的结构。
如果 n 大于栈中活动函数的数量,debug.getinfo()
将返回 nil。
这就是为什么在获取 *.name 值之前需要检查它是否存在,并且如果信息不可用则返回空字符串。
由于它在 ExportDB()
函数内部调用,它返回该函数的名称。
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
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
使用 Debug Library。 它提供了一个
getinfo(func)
函数,返回有关函数的信息的表格。