lua从函数名称的字符串调用函数

Gre*_*ire 23 lua dynamic

在lua中是否可以从表示其名称的字符串执行函数?
即:我有string x = "foo",有可能做到x()吗?

如果是,语法是什么?

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)


Joc*_*zel 5

名称不是唯一的,在不同的命名空间中可以有很多函数名称foo。但_G['foo']就是foo在全局命名空间。