Lua | 每日一练 (5)

server/2025/3/4 21:10:33/

💢欢迎来到张胤尘的技术站
💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥

文章目录

  • Lua | 每日一练 (5)
    • 题目
    • 参考答案
      • 浅拷贝
      • 深拷贝
      • 使用场景

Lua | 每日一练 (5)

题目

lua 中深拷贝和浅拷贝的区别?如何实现深拷贝?

参考答案

深拷贝和浅拷贝是编程中常见的两种数据复制方式,它们的区别主要在于对数据结构中嵌套内容的处理方式。

下面针对这两种拷贝方式进行详细的梳理。

浅拷贝

浅拷贝是指创建一个新的对象,然后将原对象中的内容根据不同的类型选择不同的处理方式。

  • 如果内容是简单数据类型(如数字、字符串、布尔值),则直接复制值;
  • 如果内容是复杂数据类型(如对象、数组、表等),则只复制其引用(即内存地址),而不是复制其内部结构。

在这里插入图片描述

下面给出代码示例,如下所示:

lua">local original = { a = 1, b = { c = 2 } }
local shallowCopy = {}for k, v in pairs(original) doshallowCopy[k] = v
end-- 修改嵌套表
shallowCopy.b.c = 3
print(original.b.c) -- 3

深拷贝

深拷贝是指创建一个新的对象,并递归地复制原对象中的所有内容,包括嵌套的复杂数据类型。深拷贝会创建完全独立的副本,修改副本中的内容不会影响原对象。

在这里插入图片描述

lua 标准库中没有直接提供深拷贝功能,但可以通过自己编写递归函数实现。例如:

lua">local function deepCopy(original)-- 检查是否为表if type(original) ~= "table" thenreturn originalend-- 创建新表local copy = {}-- 遍历原表的所有键值对for k, v in pairs(original) do-- 递归拷贝值copy[deepCopy(k)] = deepCopy(v)endreturn copy
endlocal original = { a = 1, b = { c = 2, d = { e = 3 } } }
local deepCopyTable = deepCopy(original)deepCopyTable.b.c = 10
print(original.b.c)      -- 2
print(deepCopyTable.b.c) -- 10

还有一点需要注意的是,在处理递归时如果表中存在循环引用(例如 t = {a = 1}; t.b = t),上述简单实现会导致无限递归。

为了避免上述的这种情况,可以在实现中加入一个“已拷贝表”的映射(seen 表),记录已经拷贝过的表,避免重复拷贝。另外如果表有元表,深拷贝时也需要考虑是否需要拷贝元表,以及如何处理元表中的引用。

下面给出一个改进后实现深拷贝的版本,如下所示:

lua">local function deepCopy(original, seen)-- 检查是否为表if type(original) ~= "table" thenreturn originalend-- 检查是否已经拷贝过if seen and seen[original] thenreturn seen[original]end-- 创建新表local copy = {}-- 记录已经拷贝的表seen = seen or {}seen[original] = copy-- 遍历原表的所有键值对for k, v in pairs(original) docopy[deepCopy(k, seen)] = deepCopy(v, seen)end-- 拷贝元表local mt = getmetatable(original)if mt thensetmetatable(copy, deepCopy(mt, seen))endreturn copy
endlocal t = { a = 1 }
t.b = t
local copy = deepCopy(t)
print(copy.b == copy) -- true

使用场景

  • 浅拷贝:当对象的结构简单,并且不包含嵌套的复杂数据类型时可以使用浅拷贝,另外当需要快速复制对象且不介意共享嵌套内容时也适用浅拷贝。

  • 深拷贝:当对象结构复杂,例如包含嵌套的复杂数据类型时且使用过程中需要完全独立的副本,修改副本不影响原对象时需要使用深拷贝。

🌺🌺🌺撒花!

如果本文对你有帮助,就点关注或者留个👍
如果您有任何技术问题或者需要更多其他的内容,请随时向我提问。

在这里插入图片描述


http://www.ppmy.cn/server/172430.html

相关文章

蓝桥与力扣刷题(蓝桥 k倍区间)

题目:给定一个长度为 N 的数列,A1,A2,⋯AN​,如果其中一段连续的子序列 Ai,Ai1,⋯Aj( i≤j ) 之和是 K 的倍数,我们就称这个区间[i,j] 是 K 倍区间。 你能求出数列中总共有多少个 K 倍区间吗? 输入描述 第一行包含两…

【Elasticsearch】集群配置性能优化

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s,热衷于探…

网络原理 初识[Java EE]

目录 网络发展史 独立模式 网络互联 局域网 LAN 1. 基于网络直连 2. 基于集线器(Hub)组建 3. 基于交换机(Switch)组建 4. 基于交换机和路由器(Router)组建 广域网 WAN 网络通信基础 IP 地址 1. 概念 2. 格式 端口号 1. 概念 2.格式 认识协议 1. 概念 2. 作用…

redis八股个人总结

1.MySQL和Redis的区别? 1. 基本特性 MySQL 类型:关系型数据库(RDBMS)存储方式:基于表的结构化数据存储,数据以行和列的形式存储。数据一致性:遵循ACID(原子性、一致性、隔离性、持…

Van Uploader解决Android11及以下系统上传图片无反应问题

在项目实际开发中,使用van-uploader上传图片,遇到有些Android机型点击上传图片无反应的问题,后来经过仔细分析和查找原因,发现是van-uploader官方库有特殊说明 van-uploader官方说明:Vant 4 - A lightweight, customi…

陕西省地标-DB61/T 1121-2018 政务服务中心建设和运营规范

揭秘陕西省智慧政务服务中心新标准:打造高效便捷的服务新体验 随着信息化时代的深入发展,智慧政务已成为提升政府服务效率、优化营商环境的重要举措。陕西省作为全国政务改革的先行者,近期颁布了《陕西省地标-DB61_T 1121-2018 政务服务中心…

介绍一款飞算JavaAI编程工具,集成到idea,图文并茂

飞算的插件下载地址,里边也有安装步骤: JavaAI 下载 从file-》setting-》plugin,然后走图中所示 选择从磁盘安装插件:找到下载好的压缩包然后进行idea重启 根据提示模块可以生成代码,就是需要等待,后期不…

Go红队开发—文件操作

文章目录 文件操作创建目录创建文件获取File信息文件重命名删除文件打开关闭文件判断文件是否存在判断文件是否有读取权限复制文件Read读取ReadFull读取ReadAtLeast读取ReadAll读取bufio读取Write写入WriteFile快速写入临时文件目录下载文件文件指针操作修改文件权限/拥有者/时…