Lua 表怎么克隆?Lua table clone 实现方法有哪些?

文章导读
Previous Quiz Next 克隆一个 table 指的是创建一个 table 的副本。Lua 没有内置的标准库来克隆 table,但我们可以轻松实现这个功能。table 是一种非常灵活的数据结构,也可以包含嵌套的 table。在本章中,我们将介绍克隆 tabl
📋 目录
  1. 克隆数字索引的 table
  2. 浅克隆键值形式的 table
  3. 深克隆键值形式的 table
A A

Lua - 表克隆



Previous
Quiz
Next

克隆一个 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