Lua中debug.getinfo(1, "n").name异常行为及修正方法问询
解决Lua中debug.getinfo获取函数名的异常问题
这个问题的核心是你对debug.getinfo的栈级别参数理解出现了偏差,咱们一步步拆解清楚:
为什么会出现不同的结果?
你用的debug.getinfo(1, "n").name里,第一个参数1代表的是调用当前函数的那个栈帧(也就是foo或boo的栈帧),而不是myFunc自己的栈帧。
而name字段返回的是函数在调用上下文里的名称,不是函数定义时的名字:
- 在
foo()中,myFunc是作为return语句的直接表达式被调用的,Lua无法从这个上下文里识别出它的调用名称,所以返回nil - 在
boo()中,myFunc是作为明确的函数调用出现的,上下文里它的调用名就是myFunc,所以返回这个值
如何修正?
如果你想获取myFunc自己的定义名称,只需要把栈级别参数改成0——0代表当前正在执行的函数的栈帧(也就是myFunc自身)。
修正后的代码如下:
function myFunc() local name = debug.getinfo(0, "n").name return name end function foo() return myFunc() end function boo() local name = myFunc() return name end print(foo()) -- 输出 myFunc print(boo()) -- 输出 myFunc
额外的健壮性优化
如果你的代码里可能出现匿名函数的情况,可以加个空值判断,避免debug.getinfo返回nil时引发错误:
function myFunc() local info = debug.getinfo(0, "n") local name = info and info.name or "anonymous" return name end
内容的提问来源于stack exchange,提问作者Zack Lee
相关产品推荐
相关产品推荐

