在 Lua 中复制表格

3

我在处理Lua中如何使用引用复制表格时遇到了问题。如果我有以下代码:

table = {}
table.hello = "Hello"

function MyFunction (myTable)
        myTable.goodbye = "goodbye"
        return myTable
end

table2 = MyFunction(table)

在这段代码中,table2 和 table 最终会具有完全相同的内容。我该如何让只有 table2 有 goodbye 变量呢?

Lua使用引用来复制表:正如您所了解的,Lua变量引用一个值,而赋值、返回或参数会复制引用,而不是值。 - Tom Blodget
2个回答

4
你需要创建一个新表,并将旧表中的所有字段复制到其中:
function MyFunction (oldTable)
    local newTable = {}
    for k,v in pairs(oldTable) do
        newTable[k] = v
    end
    newTable.goodbye = "goodbye"
    return newTable
end

我举的例子只进行了浅复制,所以如果oldTable中还有一些可变表字段,它们将仅被引用复制。更多信息请参见http://lua-users.org/wiki/CopyTable


3

您需要直接复制表格。

如果它是一个数组,只包含数字作为键,则可以使用经典循环:

for i=1, #table do
    table2[i] = table[i]
end

但是如果您使用文本引用,就像在您的示例中使用table.goodbye一样,您需要按键值对进行迭代:

for k,v in pairs(table) do
    table2[k] = v
end

在这两个循环中,table代表你想要复制的表格,而table2则是你想要粘贴到的表格。


注意:pairs迭代每个键,而不仅仅是那些字符串类型的键。 - Tom Blodget
1
还要注意:for i=1, #table do 循环迭代从 1 到表的“长度”的正整数,这个长度只有在表具有序列时才被定义(也许这是你所说的“数组”的超集,也许不是,因为对我来说,数组只是一个带有任何值的整数键的有界范围,但序列不能包括 nil 值)。 - Tom Blodget
@TomBlodget 我没有意图暗示;相反,我试图集中注意力在那个简单的for循环上——它不会对整数键进行迭代。另一方面,第二个评论连对我来说都是新的,感谢你启发了我! - Zoltán Schmidt

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