Lua深复制,浅复制实现
在 Lua 中,实现表(table)的浅复制和深复制是常见的操作。下面分别给出浅复制和深复制的实现代码及详细解释。
浅复制实现
浅复制只复制表的一层元素,如果表中的元素是表,那么只会复制其引用,而不会递归复制内部的表。
table.copy = function(t)
-- 创建一个新的空表
local u = {}
-- 遍历原表 t 的所有键值对
for k, v in pairs(t) do
-- 将原表的键值对复制到新表 u 中
u[k] = v
end
-- 设置新表 u 的元表为原表 t 的元表
return setmetatable(u, getmetatable(t))
end
在上述代码中,table.copy 函数接受一个表 t 作为参数。首先创建一个新的空表 u,然后使用 pairs 遍历原表 t 的所有键值对,并将其复制到新表 u 中。最后,使用 setmetatable 函数将新表 u 的元表设置为原表 t 的元表,确保新表具有与原表相同的元表行为。
深复制实现
深复制会递归地复制表及其所有嵌套的表,确保复制后的表与原表完全独立,修改其中一个表不会影响另一个表。
table.deepCopy = function(t)
-- 定义一个内部递归函数 _deepCopy,用于递归复制表
local function _deepCopy(from, to)
-- 遍历源表 from 的所有键值对
for k, v in pairs(from) do
-- 如果当前值 v 不是表类型
if type(v) ~= "table" then
-- 直接将键值对复制到目标表 to 中
to[k] = v
else
-- 如果当前值 v 是表类型,为目标表 to 创建一个新的空表
to[k] = {}
-- 递归调用 _deepCopy 函数,继续复制嵌套的表
_deepCopy(v, to[k])
end
end
-- 设置目标表 to 的元表为源表 from 的元表
return setmetatable(to, getmetatable(from))
end
-- 创建一个新的空表 u 作为初始的目标表
local u = {}
-- 调用 _deepCopy 函数,从原表 t 复制到新表 u
_deepCopy(t, u)
-- 返回复制后的新表 u
return u
end
在上述代码中,table.deepCopy 函数接受一个表 t 作为参数。首先定义了一个内部递归函数 _deepCopy,用于递归地复制表及其嵌套的表。在 _deepCopy 函数中,遍历源表 from 的所有键值对,如果当前值 v 不是表类型,则直接将键值对复制到目标表 to 中;如果当前值 v 是表类型,则为目标表 to 创建一个新的空表,并递归调用 _deepCopy 函数继续复制嵌套的表。最后,使用 setmetatable 函数将目标表 to 的元表设置为源表 from 的元表。在 table.deepCopy 函数中,创建一个新的空表 u,并调用 _deepCopy 函数从原表 t 复制到新表 u,最终返回复制后的新表 u。
通过上述代码,你可以在 Lua 中方便地实现表的浅复制和深复制操作。