1

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

4

4 回答 4

3

The insert in your example will work fine with whatever contents happen to be inside the XYZ variable (number, string, table, function, etc.).

That will not copy the table though it will insert the actual table. If you want to insert a copy of the table then you need to traverse it and insert the contents.

于 2013-07-09T13:14:35.090 回答
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
于 2013-07-09T13:42:20.240 回答
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
于 2013-07-09T13:37:47.117 回答
2

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

这在有限的情况下有效:

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

它确实试图将元素转移t2到现有t1元素之外。这可能是一项至关重要的要求,但问题中没有说明。

但是,它有一些问题:

  • 通过使用#t1and #t2,它会丢失不是正整数的键,并且可能会丢失大于跳过的整数键的整数键(即从未分配或分配nil)。
  • 它使用索引器访问第一个表,因此可以调用元__newindex方法。当只需要复制时,这可能是不可取的。
  • 它使用索引器访问第二个表,因此可以调用元__index方法。当只需要复制时,这是不可取的。

ipairs如果只需要正整数键,您可能会认为可以使用它,但它会在nil找到的第一个值时退出,因此可能会错过更多#t2

改用pairs

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

如果您确实想避免t1在键匹配或以t2某种方式映射键时替换现有值,则必须在需求中定义。

底线:pairs是获取所有密钥的方法。它有效地执行了 arawget所以它避免了调用__index. rawset是在不调用的情况下进行复制的方法__newindex

于 2013-07-09T15:29:49.693 回答