解决方法
在全局命名空间中调用一个函数(由@ THC4k提到)很容易完成,并且不需要loadstring()。
x='foo' _G[x]() -- calls foo from the global namespace
如果另一个表中的函数,如x =’math.sqrt’,则需要使用loadstring()(或遍历表)。
如果使用loadstring(),您将不仅需要使用椭圆(…)来附加括号以允许参数,还可以向前添加返回值。
x='math.sqrt' print(assert(loadstring('return '..x..'(...)'))(25)) --> 5
或走桌子:
function findfunction(x) assert(type(x) == "string") local f=_G for v in x:gmatch("[^%.]+") do if type(f) ~= "table" then return nil,"looking for '"..v.."' expected table,not "..type(f) end f=f[v] end if type(f) == "function" then return f else return nil,"expected function,not "..type(f) end end x='math.sqrt' print(assert(findfunction(x))(121)) -->11