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

Syntax 返回多个int并在Lua中将其作为多个参数传递,syntax,parameters,lua,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) 这在卢阿可能吗?我甚至喜欢这样的东西: thisFunction

我有一个函数,它接受可变数量的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)
这在卢阿可能吗?我甚至喜欢这样的东西:

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

我认为你的第二个建议的解决方案的思路有些问题,即

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

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

您可以按如下方式对repeatNum进行编码。它没有经过优化,也没有错误检查。这在Lua5.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,但我相信您需要的唯一更改是将
解包
替换为
表格。解包

我意识到这个问题已经得到了回答,但从可读性的角度来看,我想知道使用表格标记重复是否会更清晰,当然,它的效率可能要低得多

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

顺便说一句,这是“Lua”,不是“Lua”。对不起,我知道,但一位不知道区别的教授就是这样介绍我的。旧习惯很难改变。如果你所有的数字都是非负数,那么负数可以用作重复命令:
thisFunction(repNum(1,-3,2,-4,3,4,-2,7,4,2))
你应该用
n=select(“#“,…)
替换
n={…}
,因为第一个解决方案创建一个表只是为了计算参数的数量,然后丢弃它(它会产生无用的垃圾)。此外,如果某个参数为
nil
(在本例中这可能不是问题,但值得指出)。另一个效率技巧是
results[#results+1]=val
结果
追加一个值:它比调用
table.insert
(这可能很重要,因为它是在嵌套循环YMMV中调用的)。