我正在尝试构建一个 lua 测试框架,让您知道有问题的函数,但是当我从 loadstring 切换到_G
,(我进行了切换,以便我的测试工具可以看到函数调用的结果)我的函数开始使用“nil”作为函数名称
Why can _G
在下面的代码中没有检测到当前函数的名称?另外,如何从 loadstring 获取返回结果(即 blah 调用中的“false”)或在使用时设置函数名称_G
(即告诉lua解释器函数名应该是什么)?
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' 中的上面的代码)并能够得到返回值
local fname = 'blah'
status, result = pcall(??Call fname somehow??)
assert(status)
assert(not result)
--stdout should be "blah Failed"
这是 Lua 用于提供函数名称的启发式方法的限制。
在Lua中,所有函数都是匿名的。给定函数可以是多个变量的值:全局变量、局部变量和表字段。 Lua 调试系统尝试通过查看正在执行的字节码,根据值的来源找到合理的名称。
考虑更简单的例子
blah()
pcall(blah)
在第一次调用中,调试系统看到被调用的函数来自全局blah
and debug.getinfo(1).name
给出预期结果,blah
.
在第二次调用中,调试系统发现被调用的函数来自第一个参数pcall
但它并没有进一步去了解这个论点的来源,并且debug.getinfo(1).name
gives nil
.
当你打电话时也会发生同样的事情_G[name]()
。调试系统看到的只是表的一个字段,而该字段的名称相差太远。
尝试添加print(debug.traceback())
作为第一行blah
查看对此解释的另一种看法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)