Lua - 表克隆
克隆一个 table 指的是创建一个 table 的副本。Lua 没有内置的标准库来克隆 table,但我们可以轻松实现这个功能。table 是一种非常灵活的数据结构,也可以包含嵌套的 table。在本章中,我们将介绍克隆 table 的以下情况。
数字索引的 table
关联键值形式的 table
包含嵌套 table 的 table
克隆数字索引的 table
让我们创建一个克隆函数,利用 unpack() 方法来复制 table 的条目。unpack() 方法会将 table 的所有条目作为单独的值返回。
main.lua
-- 获取传入 table 的克隆的函数
function clone(original)
-- 创建一个包含 original table 所有条目的新 table
copy = { table.unpack(original) }
-- 返回副本
return copy
end
-- 原始 table
originalTable = { 11, 22, 33, 44, 55, 66}
-- 克隆 table
clonedTable = clone(originalTable)
-- 打印克隆 table 的第一个条目
print(clonedTable[1])
输出
当上述代码构建并执行时,会产生以下结果 −
11
浅克隆键值形式的 table
让我们创建一个函数,它将创建一个关联形式 table 的浅克隆。这个函数会复制顶层值和直接条目,但不会复制嵌套 table。
main.lua
-- 获取传入 table 的浅克隆的函数
function shallowClone(original)
-- 创建一个空 table
local copy = {}
-- 遍历所有条目
for key, value in pairs(original) do
copy[key] = value
end
-- 返回克隆的副本
return copy
end
-- 原始 table
originalTable = { Mon="Monday", Tue="Tuesday", Wed="Wednesday", Thu="Thursday",
Fri="Friday", Sat="Saturday", Sun="Sunday" }
-- 克隆 table
clonedTable = shallowClone(originalTable)
-- 打印克隆 table 的一个条目
print(clonedTable.Sun)
输出
当上述代码构建并执行时,会产生以下结果 −
Sunday
深克隆键值形式的 table
让我们创建一个函数,它将创建一个关联形式 table 的深克隆。这个函数会通过递归调用来复制嵌套 table。
main.lua
-- 获取传入 table 的深克隆的函数
function deepClone(original)
local copy
local orig_type = type(original)
if orig_type == 'table' then
-- 创建一个空 table
copy = {}
-- 遍历所有条目
for key, value in next, original, nil do
copy[deepClone(key)] = deepClone(value)
end
setmetatable(copy, deepClone(getmetatable(original)))
else
-- 对于数字、字符串等情况
copy = original
end
-- 返回克隆的副本
return copy
end
-- 原始 table
studentDetails = {
student = { name = "Robert", age = 12},
address = { city = "HYD", pincode = 500031}
}
-- 克隆 table
clonedTable = deepClone(studentDetails)
-- 打印克隆 table 的一个条目
print(clonedTable.student.name)
输出
当上述代码构建并执行时,会产生以下结果 −
Robert