【问题标题】:Combine two variadic function results组合两个可变参数函数结果
【发布时间】:2014-01-09 22:51:51
【问题描述】:

假设我有两个像这样的可变参数函数:

function a(num)
  if num == 1 then
    return 1
  else
    return 1, 2
  end
end    

function b(num)
  if num == 1 then
    return 1
  else
    return 1, 2
  end
end

然后我想构建另一个函数,它调用ab 并返回来自a 的所有结果,然后返回来自b 的所有结果。我想写这样的东西:

function c(num)
  return a(num), b(num)
end

但它只返回来自a 的第一个结果,然后是来自b 的所有结果。我该怎么做?

【问题讨论】:

    标签: function lua variadic-functions variadic


    【解决方案1】:

    只能返回表达式列表中最后一个函数的所有结果;其他的将被截断为一个结果。

    结果,这

    function f1()
        return 1
    end
    
    function f2()
        return 2, 3
    end
    
    print(f1(), f2())
    

    按预期打印1 2 3,但这

    print(f2(), f1())
    

    打印2 1,因为f2() 被截断为一个结果。

    作为一种解决方法,如果您提前知道结果的数量,您可以这样做

    local a, b = f1()
    local c, d = f2()
    return a, b, c, d
    

    或者对于任意数量的结果,你可以这样做

    local t1 = {f1()}
    local t2 = {f2()}
    -- Append t2 to t1
    return unpack(t1)
    

    【讨论】:

      【解决方案2】:

      当您将列表展开到列表上下文中时,或者仅使用第一项,或者,如果展开发生在列表上下文的末尾,则使用所有项。 (对不起,Perl-ish 术语。)

      您可以在表构造函数{ a(num) } 中捕获所有列表项。由于列表作为列表上下文中的最后一项展开,因此会使用所有项。

      反过来,您可以使用unpack 函数将表格缩减为列表。但是,它使用表“长度”概念,该概念仅适用于连续序列数组。由于函数结果可能在任何地方包含nil,因此您必须通过计数来测量表中的项目数,并使用pairs 函数迭代表。

      local function a(num)
        if num == 1 then
          return 1
        else
          return nil, 2
        end
      end    
      
      local function b(num)
        if num == 1 then
          return 1
        else
          return nil, 2
        end
      end
      

      .

      local function c(num)
          local t = {}
          local n = 0
          local bOffset = 0 
          for k, v in pairs({ a(num) }) do
              table.insert(t, k, v)
              if (k > n) then
                  n = k
              end
              if (k > bOffset) then
                  bOffset = k
              end
          end
          for k, v in pairs({ b(num) }) do
              table.insert(t, bOffset + k, v)
              if (bOffset + k > n) then
                  n = bOffset + k
              end
          end
      
          return unpack(t, 1, n) 
      end
      print(nil,2,nil,2)
      print(c(0202))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-07
        • 2022-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-09
        • 2019-12-26
        相关资源
        最近更新 更多