2016-08-27 143 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鍵上進行迭代。另一方面,第二個評論對我來說也是新的,這要感謝啓發! –