在Lua中将表分配给表

时间:2013-07-09 13:05:37

标签: lua lua-table

在Lua中,我可以使用table.insert(tableName, XYZ)在表格中添加一个条目。有没有办法可以将现有的表添加到表中?我的意思是直接调用而不是遍历并添加它。 感谢

4 个答案:

答案 0 :(得分:3)

您的示例中的插入将适用于XYZ变量(数字,字符串,表格,函数等)中的任何内容。

虽然它会插入实际的表,但不会复制表。如果要插入表的副本,则需要遍历它并插入内容。

答案 1 :(得分:3)

首先:通常,需要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 :(得分:3)

如果我理解你的意思,你想要这样做:

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

答案 3 :(得分:2)

不,您必须将第二个表的键/值对复制到第一个表中。从第二个表复制现有值就是所谓的“浅拷贝”。第一个表将引用与第二个表相同的对象。

这在有限的情况下有效:

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的情况下进行复制的方法。