2016-08-27 144 views
3

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

table = {} 
table.hello = "Hello" 

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

table2 = MyFunction(table) 

在这段代码中,table2和table最终会拥有完全相同的内容。我怎么能这样做只有table2有再见变量?

+0

“Lua使用对重复表的引用”:正如我认为你理解一个Lua变量引用一个值和一个赋值,返回或参数重复引用而不是值。 –

回答

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

2

您从字面上必须复制表格。

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

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是一个你粘贴。

+0

注意:对迭代遍历每个键,而不仅仅是那些字符串类型的键。 –

+1

还要注意:'for i = 1,#table do'遍历从1到表格的“长度”的正整数,只有在[表格有序列时](https:// www。 lua.org/manual/5.3/manual.html#3.4.7)(也许这是你所说的“是一个数组”的一个超集;也许不是,因为对于我来说,一个数组只是意味着有限范围的整数键与任何值,但一个序列不能包含零值)。 –

+0

@TomBlodget我无意暗示;相反,我试着把注意力集中在这个简单的方法上,而不是在* non * -integer键上进行迭代。另一方面,第二个评论对我来说也是新的,这要感谢启发! –