返回多个int并在Lua中将它们作为多个参数传递

时间:2013-09-29 03:18:41

标签: syntax parameters lua

我有一个函数,它将可变数量的int作为参数。

thisFunction(1,1,1,2,2,2,2,3,4,4,7,4,2)

这个函数是在一个框架中给出的,我宁愿不改变函数的代码或它来自的.lua。所以我想要一个函数,为我重复一定数量的次数,这样就不那么重复了。可以像这样工作并实现上面所做的事情

thisFunction(repeatNum(1,3),repeatNum(2,4),3,repeatNum(4,2),7,4,2)

这可能在Lua吗?我对这样的事情感到很满意:

thisFunction(repeatNum(1,3,2,4,3,1,4,2,7,1,4,1,2,1))

2 个答案:

答案 0 :(得分:3)

我认为你坚持使用第二个提出的解决方案,即

 thisFunction(repeatNum(1,3,2,4,3,1,4,2,7,1,4,1,2,1))

因为如果使用在列表中间返回多个值的函数,则会对其进行调整,使其仅返回一个值。但是,在列表的末尾,该函数没有调整其返回值。

您可以按如下方式对repeatNum进行编码。它没有经过优化,也没有错误检查。这适用于Lua 5.1。如果您使用的是5.2,则需要进行调整。

function repeatNum(...)
     local results = {}
     local n = #{...}
     for i = 1,n,2 do
       local val = select(i, ...)
       local reps = select(i+1, ...)
       for j = 1,reps do
          table.insert(results, val)
       end
     end
     return unpack(results)
end

我没有在此计算机上安装5.2,但我相信您需要的唯一更改是将unpack替换为table.unpack

答案 1 :(得分:1)

我意识到这个问题已得到解答,但我从可读性的角度来看,如果使用表格来标记重复会更清楚,当然它的效率可能会低得多。

function repeatnum(...)
    local i = 0
    local t = {...}
    local tblO = {}
    for j,v in ipairs(t) do
        if type(v) == 'table' then
           for k = 1,v[2] do
               i = i + 1
               tblO[i] = v[1]
           end
        else
           i = i + 1
           tblO[i] = v
        end
    end
    return unpack(tblO)
end
print(repeatnum({1,3},{2,4},3,{4,2},7,4,2))