在Lua中,我可以使用table.insert(tableName, XYZ)
在表格中添加一个条目。有没有办法可以将现有的表添加到表中?我的意思是直接调用而不是遍历并添加它。
感谢
答案 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
,因此它可以避免调用__index
。 rawset
是在不调用__newindex
的情况下进行复制的方法。