Lua:如何将表中的一行复制到另一个表?

我试图将一个表的一行复制到另一个表中。这是我第一次这样做,所以就像理所当然的那样,我只是这样做了:

table.insert(table_destination[l], table_origin[l])

这个方法可以正常工作,但是当我修改了table_origin中的行时,table_destination也会改变!

我在Google中搜索了一下,发现了一些关于深拷贝和浅拷贝的文章。我对这方面不是很有经验,所以想寻求帮助。

我怎样才能将一个表的一行复制到另一个表中,以便我可以独立地对两个表进行更改操作?

点赞
用户1483676
用户1483676

Lua 中的表格是按引用传递的。你需要实现类似于 shallowcopy 的方法来创建一个与其他表格相同的新表格。

function shallowcopy(t)
    local t2 = {}
    for k, v in pairs(t) do
        t2[k] = v
    end
    return t2
end

table.insert(table_destination[l], shallowcopy(table_origin[l]))

你也可以实现 deepcopy 函数,它也会递归地复制所有子表格。注意:由于可能存在循环引用和/或不属于本表格的子表格,这可能是危险的。此函数假定表格“拥有”所有子表格,而不仅仅是引用它们。

function deepcopy(t)
    if type(t) ~= 'table' then
        return t
    end
    local t2 = {}
    for k, v in pairs(t) do
        t2[k] = deepcopy(v)
    end
    return t2
end

table.insert(table_destination[l], deepcopy(table_origin[l]))

这两个简单的代码片段并不处理诸如复制元表、可能存在的 __pairs 元方法、用作键的表格等等的情况。

你可以在 这里这里 找到更好(或更复杂)的表格复制实现。

2014-06-25 12:31:31