将Lua中的一个表分配给另一个表。

在 Lua 中,我可以使用 table.insert(tableName, XYZ) 在表内添加项。是否有一种方法将已存在的表添加到表中?我指的是直接调用而不是遍历并添加它。谢谢。

点赞
用户258523
用户258523

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

但这不会复制表,而是将实际表插入。如果你想要插入表副本,则需要遍历它并插入内容。

2013-07-09 13:14:35
用户1685701
用户1685701

首先:通常情况下,你 不需要 使用 table.insert 来向表中添加新条目。

在 Lua 中,表是键值对的集合;可以像这样添加条目:

local t = {}  -- 表
local key= "name"
local value = "Charlie"

t[key] = value  -- 新增一个条目(替换相同键值下已有的值!)
print(t.name) --> "Charlie"

请注意,key 可以是 任何类型 的(不仅限于整数/字符串)!

很多时候,你会需要一个简单特殊情况下使用表:一个值序列(“列表”,“数组”)。对于 Lua,这意味着你希望一个表中的所有键都是连续的整数,并且包含非 nil 值。table.insert 函数就是为了处理这种特殊情况:它允许你在特定位置插入一个值(如果没有指定位置,则将其附加到序列的末尾):

local t = {"a", "b", "d"} -- 包含三个字符串的序列(t[1] = "a",...)

table.insert(t, "e") -- 将 "e" 附加到序列中

table.insert(t, 3, "c") -- 在索引 3 处插入 "c"(移动较高索引处的值)

-- 输出整个序列
for i=1,#t do
  print(t[i])
end
2013-07-09 13:37:47
用户204011
用户204011

如果我正确理解了你的意思,你想要做到这个:

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-09 13:42:20
用户2226988
用户2226988

不,你必须将第二个表的键值对复制到第一个表中。从第二个表复制现有值被称为“浅拷贝”。第一个表将引用与第二个表相同的对象。

这在有限的情况下有效:

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

2013-07-09 15:29:49