Lua中表的连接

Joh*_*ell 29 lua concatenation lua-table

原始邮政

鉴于Lua中没有内置函数,我正在寻找一个允许我将表附加在一起的函数.我搜索了很多,并尝试了我偶然发现的所有解决方案,但似乎都没有正常工作.

场景是这样的:我在应用程序中使用Lua.应用程序的内部命令以表格的形式返回值列表.

我想要做的是在循环中递归调用该命令,并将返回的值再次以表格的形式附加到以前迭代的表中.


编辑

对于那些将来遇到这篇文章的人,请注意@gimf发布的内容.由于Lua中的Tables与其他任何内容一样(即使在列表上下文中),因此没有真正正确的方法将一个表附加到另一个表.最接近的概念是合并表格.请查看帖子" Lua - 合并表? "以获得这方面的帮助.

Wee*_*ine 27

过于复杂的答案很多?

这是我的实施:

function TableConcat(t1,t2)
    for i=1,#t2 do
        t1[#t1+1] = t2[i]
    end
    return t1
end
Run Code Online (Sandbox Code Playgroud)

  • 据我所知,`ipairs`保证迭代顺序为`for i = 1` ...直到第一个t [i] == nil,no?对于非退化情况,与`i = 1,#t`相同.重新插入`插入`与索引设置,你是对的 - 我测量并且有5-6倍的性能差异 (7认同)
  • NB:`ipairs`~ =`pair`."i"有一个原因.`pair`是乱的,`ipairs`不是 (7认同)
  • 第三行不应该是`t1[#t1+i] = t2[i]`吗? (3认同)
  • ipairs 只比普通的贵一点,不使用它的原因是它不能保证表中项目的顺序。不使用 insert 的原因是它比表上设置的标准索引成本要高得多,因为 insert 将调用一个例程,将表中的值从调用它的索引推回,而没有超过 [#t 的值+1],例程仍然被调用,导致性能问题,在编译语言上,没有区别,但是使用解释语言,我们必须小心我们要求计算机为我们做什么 (2认同)

Nas*_*nov 11

还有一种方法:

for _,v in ipairs(t2) do 
    table.insert(t1, v)
end
Run Code Online (Sandbox Code Playgroud)

在我看来,它是最易读的——它遍历第二个表并将其值附加到第一个表,即故事的结尾。好奇它在速度上如何与上面的显式索引 [] 相比


Rom*_*rio 8

如果要将现有表连接到新表,这是最简洁的方法:

local t = {3, 4, 5}
local concatenation = {1, 2, table.unpack(t)}
Run Code Online (Sandbox Code Playgroud)

虽然我不确定这在性能方面有多好。

  • 请注意,这仅在“table.unpack”是最后一个参数时才有效(与Python的“*t”或JavaScript的“...t”不同),请参阅/sf/ask/2616052771/当我调用解包为 luas 函数参数时发生 (16认同)

war*_*ing 6

一个简单的方法来做你想做的事:

local t1 = {1, 2, 3, 4, 5}
local t2 = {6, 7, 8, 9, 10}

local t3 = {unpack(t1)}
for I = 1,#t2 do
    t3[#t1+I] = t2[I]
end
Run Code Online (Sandbox Code Playgroud)

  • 为什么是`{unpack(t1)}`?!我所做的一切都是复制`t1`,但问题暗示就地更新? (2认同)
  • @NasBanov 他问如何连接。当您连接字符串时,您会得到一个新字符串。我以为他想要那样的东西。 (2认同)

小智 5

要一起添加两个表,请执行此操作

    ii=0
for i=#firsttable, #secondtable+#firsttable do
    ii=ii+1
    firsttable[i]=secondtable[ii]
end
Run Code Online (Sandbox Code Playgroud)

使用第一个表作为要添加的变量,因为代码按顺序将第二个表添加到第一个表的末尾.

  • i 是表或列表的起始编号.
  • #secondtable+#firsttable 是什么结束.

它从您要添加到的第一个表的末尾开始,并在for循环中结束于第二个表的末尾,因此它适用于任何大小的表或列表.


gim*_*mpf 2

如果您想合并两个表,但需要结果表的深层复制,无论出于何种原因,请使用来自另一个有关合并表的SO问题的合并以及来自lua-users的一些深层复制代码。

(编辑 好吧,也许你可以编辑你的问题以提供一个最小的例子......如果你的意思是一个表

 { a = 1, b = 2 }
Run Code Online (Sandbox Code Playgroud)

与另一个表连接

{ a = 5, b = 10 }
Run Code Online (Sandbox Code Playgroud)

应该导致

{ a = 1, b = 2, a = 5, b = 10 }
Run Code Online (Sandbox Code Playgroud)

那你就不走运了。 钥匙是独一无二的。

看来你想要一个成对的列表,比如{ { a, 1 }, { b, 2 }, { a, 5 }, { b, 10 } }. 您还可以使用最终结构,例如{ a = { 1, 5 }, b = { 2, 10 } },具体取决于您的应用程序。

但是“连接”表的简单概念对于 Lua 表来说没有意义。