gwe*_*ell 39
在全局命名空间中调用函数(如@ THC4k所述)很容易完成,并且不需要loadstring().
x='foo'
_G[x]() -- calls foo from the global namespace
Run Code Online (Sandbox Code Playgroud)
loadstring()如果函数在另一个表中,您将需要使用(或遍历每个表),例如if x='math.sqrt'.
如果loadstring()使用if ,你不仅要添加带椭圆的括号(...)以允许参数,还要添加return到前面.
x='math.sqrt'
print(assert(loadstring('return '..x..'(...)'))(25)) --> 5
Run Code Online (Sandbox Code Playgroud)
或走桌子:
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
Run Code Online (Sandbox Code Playgroud)
kon*_*niu 13
我经常在表中放入一堆函数:
functions = {
f1 = function(arg) print("function one: "..arg) end,
f2 = function(arg) print("function two: "..arg..arg) end,
...,
fn = function(arg) print("function N: argh") end,
}
Run Code Online (Sandbox Code Playgroud)
然后你可以使用一个字符串作为表索引并像这样运行你的函数
print(functions["f1"]("blabla"))
print(functions["f2"]("blabla"))
Run Code Online (Sandbox Code Playgroud)
这是结果:
function one: blabla
function two: blablablabla
Run Code Online (Sandbox Code Playgroud)
我发现这比使用更干净loadstring().如果您不想创建一个特殊的功能表,您可以使用_G['foo'].
Nor*_*sey 11
loadstring这不是答案.对于初学者,你需要一个return字符串,以及我不会涉及的其他细节.
THC4k有正确的想法; 如果你在变量x中有函数名,那么你想要的调用是
_G[x](arg1, arg2, ...)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
34110 次 |
| 最近记录: |