Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dynamic lua从具有函数名的字符串调用函数_Dynamic_Lua - Fatal编程技术网

Dynamic 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有正确的想法

在lua中,是否可以从表示其名称的字符串执行函数?
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()

如果函数位于另一个表中,例如if
x='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