Why is 'name' nil for debug.getinfo(1)
我正在尝试建立一个lua测试框架,让您知道出现问题的函数,但是当我从loadstring切换到
为什么在以下代码中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | function run_test(one, two) if one ~= two then print(debug.getinfo(2).name..' Failed') end end function blah() run_test(false, true) return false end local fname = 'blah' local status, result = pcall(_G[fname]) -- Outputs 'nil'; result is 'false' local status, result = pcall(loadstring(fname..'()')) -- Outputs 'blah', result is 'nil' |
我需要的主要是一种使用函数名称字符串调用函数的方法,能够看到调用内部的函数名称(用于测试失败以指向失败的函数,如fname ='blah' 上面的代码)并能够获取返回值
1 2 3 4 5 6 | local fname = 'blah' status, result = pcall(??Call fname somehow??) assert(status) assert(not result) --stdout should be"blah Failed" |
这是Lua用于提供函数名称的启发式方法的限制。
在Lua中,所有功能都是匿名的。给定的函数可以是多个变量的值:全局,局部和表字段。 Lua调试系统会通过查看正在执行的字节码来尝试根据值的来源找到一个合理的名称。
考虑更简单的例子
1 2 | blah() pcall(blah) |
在第一个调用中,调试系统会看到正在调用的函数来自全局
在第二次调用中,调试系统看到正在调用的函数来自
当您调用
尝试将