4

我有一个函数,它接受可变数量的整数作为参数。

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))
4

2 回答 2

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,但我相信您需要的唯一更改是替换unpacktable.unpack.

于 2013-09-29T04:31:22.863 回答
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))
于 2013-09-29T11:49:58.153 回答