【问题标题】:Lua function call with parameter list in a string使用字符串中的参数列表调用 Lua 函数
【发布时间】:2012-10-13 02:20:39
【问题描述】:

是否可以在 LUA 中执行类似 foo("param1, param2, param3, param4") 的函数,并将其检测为 foo(param2, param2, param3, param4)

为什么? 我有一个场景,一个函数可以接收任意多的参数,并且不能作为列表发送(它在 CoronaSDK 中,所以我不能真正修改源,必须适应它)。所以,有时我必须发送 3 个参数,而有时我会发送 100 个。有什么办法吗?

【问题讨论】:

    标签: dynamic lua coronasdk


    【解决方案1】:

    它们不能作为列表发送(它在CoronaSDK中,所以我不能真正修改源,必须适应它)

    当然可以。观看:

    function CallWithParametersInAList(FunctionToCall, paramsInList)
      return FunctionToCall(unpack(paramsInList))
    end
    

    看到了吗? paramsInList 中的每个数组元素都将被解压缩为 FunctionToCall 的参数。此外,来自FunctionToCall 的每个返回值都会被返回。

    function test(a)
        print("this is lua test function."..a);
    end
    
    CallWithParametersInAList(test,{33333});
    
    

    输出

    this is lua test function.33333
    

    【讨论】:

      【解决方案2】:

      您可以调用具有任意多个参数的 lua 函数。如果函数需要更多参数,它们将被设置为 nil。如果函数需要的参数太少,发送的额外参数将被忽略。

      例如:

      function f(a, b, c)
        print(a, b, c)
      end
      
      f(1, 2) -- prints: 1 2 nil
      
      f(1, 2, 3) -- prints: 1 2 3
      
      f(1, 2, 3, 4, 5) -- prints: 1 2 3
      

      编辑:

      如果您必须从字符串中获取参数并且这些参数包括表和函数之类的东西,那么您别无选择,只能通过 loadstring 函数获取字符串:

      -- s contains the parameters
      s = '1,2,{1,2,3}'
      
      -- f is the function you want to call
      loadstring('f(' .. s .. ')')()  -- prints: 1  2  table: 0061D2E8
      

      我不确定 CoronaSDK,但 loadstring 函数往往有点慢。如果可能,尽量避免。

      【讨论】:

      • OP 想要将 string 转换为参数列表。
      • @lhf:这是一个 XY 问题;他试图以错误的方式解决实际问题(调用带有任意参数的函数)。
      【解决方案3】:

      在我看来(也是我使用的)最好的方法之一是这样的:

      function Call( ... )
          -- All passed arguments are stored in a default table named arg
          table.foreach( arg, print )
      end
      

      还有,这是codepad - oDmVZ209 上的一个工作示例。

      【讨论】:

      • 这是 Lua 5.0 语法,在 Lua 5.1 中已弃用并在 Lua 5.2 中删除(均与 argtable.foreach 函数有关)。
      【解决方案4】:

      我想告诉 Nicol Bolas,您可能正在尝试解决错误的问题,但如果您仍想解析字符串并将其转换为参数列表,这是一种方法(loadstring 是在 Corona 环境中不可用;显然这不处理任何类型的分层数据):

      function str2list(s)
        local parms = {}
        for p in s:gmatch("([^,]+),?") do table.insert(parms, p) end
        return unpack(parms)
      end
      print(str2list("param1, param2, param3, param4"))
      

      【讨论】:

        猜你喜欢
        • 2017-09-29
        • 1970-01-01
        • 1970-01-01
        • 2015-05-15
        • 2010-12-19
        • 2014-11-20
        • 2019-10-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多