我正在尝试组建一个lua测试框架,让你知道有问题的功能,但是当我从loadstring切换到_G
时,(我切换了,所以我的测试工具可以看到结果函数调用)我的函数开始使用'nil'作为函数名
为什么_G
无法检测以下代码中当前函数的名称?另外,如何从loadstring中获取返回结果(即来自blah调用的'false')或者在使用_G
时设置函数名称(即告诉lua解释器函数名称应该是什么)? / p>
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"
答案 0 :(得分:4)
这是Lua用于为函数提供名称的启发式方法的限制。
在Lua中,所有功能都是匿名的。给定函数可以是几个变量的值:全局,本地和表字段。 Lua调试系统试图通过查看正在执行的字节码来根据它的来源找到一个合理的名称。
考虑更简单的例子
blah()
pcall(blah)
在第一次调用中,调试系统发现被调用的函数来自全局blah
,而debug.getinfo(1).name
给出了预期结果blah
。
在第二次调用中,调试系统看到被调用的函数来自pcall
的第一个参数,但它没有进一步查看该参数的来源,debug.getinfo(1).name
给出{ {1}}。
当您致电nil
时,会发生同样的事情。所有调试系统都看到一个表的字段,并且该字段的名称太远了。
尝试添加_G[name]()
作为print(debug.traceback())
的第一行,以便看到另一个解释。