2013-07-09 90 views
0

在Lua中,我可以在table.insert(tableName, XYZ)的表格內添加一個條目。有沒有辦法將已經存在的表格添加到表格中?我的意思是直接調用而不是遍歷並添加它。 謝謝將表分配給Lua中的表格

+0

您的意思是通過引用或按值添加現有表?如果按照意味着將內容從現有表格複製到新表格並插入該表格的值。前者在添加時不需要任何遍歷,因爲沒有進行復制。這是你的意思嗎? – greatwolf

回答

2

在你的例子中的插入將正常工作與任何內容發生在XYZ變量(數字,字符串,表,函數等)。

雖然會插入實際的表格,但不會複製表格。如果你想插入一個表的副本,那麼你需要遍歷它並插入內容。

2

第一:一般來說,你做不是需要table.insert把新條目放到表中。 Lua中的表是鍵值對的集合;條目可以做出這樣的:

local t = {} --the table 
local key= "name" 
local value = "Charlie" 

t[key] = value --make a new entry (replace an existing value at the same key!) 
print(t.name) --> "Charlie" 

注意關鍵可以任何類型(不僅僅是整數/字符串)!

通常情況下,您需要一個簡單的特殊情況表:值的序列(「列表」,「數組」)。對於Lua來說,這意味着你需要一個表,其中所有的鍵都是連續的整數,並且包含所有非零值。該table.insert功能非常適合那些特殊情況:它可以讓你在某個位置插入一個值(或在序列結束時,如果沒有指定位置,將其追加):

local t = {"a", "b", "d"} --a sequence containing three strings (t[1] = "a", ...) 

table.insert(t, "e") --append "e" to the sequence 

table.insert(t, 3, "c") --insert "c" at index 3 (moving values at higher indices) 

--print the whole sequence 
for i=1,#t do 
    print(t[i]) 
end 
2

如果我明白你的意思正確,你想這樣做的:

local t1 = {1, 2, 3} 
local t2 = {4, 5, 6} 
some_function(t1, t2) 
-- t1 is now {1, 2, 3, 4, 5, 6} 

確實是有沒有辦法做到這一點不反覆t2。這裏有一個方法來寫some_function

local some_function = function(t1, t2) 
    local n = #t1 
    for i=1,#t2 do t1[n+i] = t2[i] end 
end 
+0

如果源表是層次表?我不知道這個層次結構會在 –

1

不,你必須在第二個表的鍵/值對複製到第一個表。從第二個表複製現有的值就是所謂的「淺拷貝」。第一個表格將引用與第二個表格相同的對象。

此作品在有限條件下:

local n = #t1 
for i=1,#t2 do t1[n+i] = t2[i] end 

它試圖將t2元素轉移到剛剛超越現有t1元素。這可能是一個至關重要的要求,但沒有在問題中說明。

它有幾個問題,雖然:

  • 通過使用#t1#t2,它忽略不屬於正整數鍵和可錯過的整數比跳過的整數鍵更大的鍵(即從未分配或分配nil)。
  • 它使用索引器訪問第一個表,因此可以調用__newindex元方法。當只需要複製時,可能將不可取。
  • 它使用索引器訪問第二個表,因此可以調用__index元方法。當只需要複製時,這不是理想的。

你可能會認爲,如果只有正整數鍵被通緝ipairs可以使用,但它退出上找到這樣的第一nil值可能會錯過甚至超過#t2一樣。

使用pairs代替:

for key, value in pairs(t2) do 
    rawset(t1, key, value) 
end 

如果你想避免更換現有t1值當密鑰匹配或以其他方式映射,然後某種方式,在需求被定義t2鍵。

底線:pairs是獲取所有密鑰的方式。它有效地做了rawget,所以它避免了調用__indexrawset是在不調用__newindex的情況下執行副本的方式。

+0

上感謝湯姆。如果源表是層次表(表內的表)怎麼辦?我不知道會有多少層次級別存在。以上將在此工作? –

+0

表中的每個鍵都包含對值的引用。該值可以是任何內容(除非'nil',在這種情況下密鑰被刪除),包括一個表。所以,當複製一個值時,它是對被複制的值的引用。如果該值引用內部表,則該副本將引用相同的內部表。這與你使用'table.insert'做同樣的事情。如果沒關係,那麼你就完成了。如果你想要一個「深層複製」而不是「淺層複製」,那麼在問題中以及爲什麼要這樣說。另請參閱[這裏](http://lua-users.org/wiki/CopyTable)。 –