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

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
顺便提一下,正确的拼写是Lua,而不是LUA。 - Colonel Thirty Two
1
抱歉,我知道,但这是我的教授介绍给我的方式,他不知道其中的区别。老习惯难改。 - theman
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版本,但我认为你需要做的唯一更改就是用table.unpack替换unpack


如果您的所有数字都是非负数,则可以使用负数作为重复命令:thisFunction(repNum(1,-3,2,-4,3,4,-2,7,4,2)) - Egor Skriptunoff
你应该将 n=#{...} 替换为 n=select("#",...),因为第一种解决方案仅创建一个表来计算参数的数量,然后丢弃它(它创建了无用的垃圾)。此外,如果某个参数是 nil,它的效果不好(在这种情况下可能不是问题,但值得指出)。另一个效率技巧是使用 results[#results+1]=val 将值附加到 results:这比调用 table.insert 更快(由于它在嵌套循环中被调用,所以这可能很重要,具体情况而定)。 - Lorenzo Donati support Ukraine

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接