Dynamic lua从具有函数名的字符串调用函数
在lua中,是否可以从表示其名称的字符串执行函数?Dynamic lua从具有函数名的字符串调用函数,dynamic,lua,Dynamic,Lua,在lua中,是否可以从表示其名称的字符串执行函数? i、 e:我有字符串x=“foo”,是否可以执行x() 如果是,语法是什么?名称不是唯一的,在不同的名称空间中可能有许多函数名foo。但是\u G['foo']在全局名称空间中是foo。听起来你想做一个“eval”,Lua支持这样的操作: assert(loadstring(x))() 不过,您可能需要先将“()”连接到x上。loadstring不是这里的答案。对于初学者来说,字符串中需要一个返回值,其他细节我将不赘述 THC4k有正确的想法
i、 e:我有
字符串x=“foo”
,是否可以执行x()
如果是,语法是什么?名称不是唯一的,在不同的名称空间中可能有许多函数名foo。但是
\u G['foo']
在全局名称空间中是foo
。听起来你想做一个“eval”,Lua支持这样的操作:
assert(loadstring(x))()
不过,您可能需要先将“()”连接到x上。
loadstring
不是这里的答案。对于初学者来说,字符串中需要一个返回值
,其他细节我将不赘述
THC4k有正确的想法;如果变量x中有函数名,则需要调用
_G[x](arg1, arg2, ...)
调用全局命名空间中的函数(如@THC4k所述)很容易,并且不需要
loadstring()
如果函数位于另一个表中,例如ifx='math.sqrt'
,则需要使用loadstring()
(或遍历每个表)
如果使用了loadstring()
,则您不仅希望在括号中附加椭圆(…)
,以允许参数,而且还希望在前面添加return
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
我经常在一个表中放一些函数:
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,
}
然后您可以使用字符串作为表索引,并像这样运行您的函数
print(functions["f1"]("blabla"))
print(functions["f2"]("blabla"))
结果是:
function one: blabla
function two: blablablabla
我发现这比使用
loadstring()
更干净。如果您不想创建一个特殊的函数表,您可以使用\u G['foo']
不回答前面提到的问题,但提供了一个简单的解决方法,我将使用它。如果您想调用一个非全局函数,该怎么办。例如,我需要调用另一个模块中的函数,它有自己的变量。如果我在当前名称空间中复制这个函数,那么我也会复制它们的变量的本地副本…如果你想调用一个非全局函数呢。例如,我需要调用另一个模块中的函数,它有自己的变量。如果我在当前名称空间中复制这个函数,那么我也会复制它们的变量的本地副本。。。
function one: blabla
function two: blablablabla