代码之家  ›  专栏  ›  技术社区  ›  Gregoire

lua从具有函数名的字符串调用函数

  •  22
  • Gregoire  · 技术社区  · 15 年前


    i、 e:我有 string x = "foo" x() ?

    如果是,语法是什么?

    5 回复  |  直到 15 年前
        1
  •  41
  •   gwell    15 年前

    在全局名称空间中调用函数(如@THC4k所述)很容易,并且不需要 loadstring() .

    x='foo'
    _G[x]() -- calls foo from the global namespace
    

    你需要使用 loadstring() x='math.sqrt'

    如果 使用时,您不仅希望用椭圆附加括号 (...) 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
    
        2
  •  15
  •   koniu    14 年前

    我经常在一个表中放一些函数:

    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() . 如果不想创建特殊的函数表,可以使用 _G['foo'] .

        3
  •  11
  •   Norman Ramsey    15 年前

    loadstring 这不是答案。首先,你需要一个 return 在字符串中,以及其他我将不深入讨论的细节。

    THC4k有正确的想法;如果变量x中有函数名,则需要调用

    _G[x](arg1, arg2, ...)
    
        4
  •  5
  •   Jochen Ritzel    15 年前

    _G['foo'] foo

        5
  •  3
  •   perimosocordiae    15 年前

    assert(loadstring(x))()
    

    不过,您可能需要先将“()”连接到x上。