Lua | 每日一练 (5)

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

文章目录

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

Lua | 每日一练 (5)

题目

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 标准库中没有直接提供深拷贝功能,但可以通过自己编写递归函数实现。例如:

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 表),记录已经拷贝过的表,避免重复拷贝。另外如果表有元表,深拷贝时也需要考虑是否需要拷贝元表,以及如何处理元表中的引用。

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

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.mzph.cn/pingmian/71327.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HOW - 在Windows浏览器中模拟MacOS的滚动条

目录 一、原生 CSS 代码实现模拟 macOS 滚动条额外优化应用到某个特定容器 二、Antd table中的滚动条场景三、使用第三方工具/扩展 如果你想让 Windows 里的滚动条 模拟 macOS 的效果(细窄、圆角、隐藏默认轨道)。 可以使用以下几种方案: 一…

服务器租用:静态BGP和动态BGP分别指什么?

今天小编主要来带大家一起了解一下静态BGP和动态BGP分别是指什么? BGP主要是用在不同网络之间进行交换路由信息的协议,通常是用在互联网当中,而静态BGP和动态BGP是两种不同的方法来配置BGP路由,静态BGP路由是由手动配置的&#xf…

版图自动化连接算法开发 00004 ------ 给定一个点,添加一个中间点实现 Manhattan 方式连接两个给定的坐标点

版图自动化连接算法开发 00004 ------ 给定一个点,添加一个中间点实现 Manhattan 方式连接两个给定的坐标点 引言正文引言 必读文章 ------ 版图自动化连接算法开发 00001 ------ 直接连接两个给定的坐标点。 此处,我们对给定点的坐标进行一下限制,因为是只添加一个点,因…

JavaEE--计算机是如何工作的

一、一台计算机的组成部分 1.CPU(中央处理器) 2.主板(一个大插座) 3.内存(存储数据的主要模板) 4.硬盘(存储数据的主要模板) 内存和硬盘对比: 内存硬盘读写速度快慢存…

电源测试系统有哪些可以利用AI工具的科技??

AI技术的发展对电源模块测试系统的影响是深远的,不仅协助系统提升了测试效率和精度,还推动了测试方法的创新和智能化。那么在电源测试系统中哪些模块可以利用AI工具实现自动化测试? 1. 自动化测试与效率提升 智能测试流程优化 AI算法可以自动优化测试…

React 之 Redux 第二十八节 学习目标与规划大纲及概要讲述

接下来 开始Redux 全面详细的文档输出,主要基于一下几个方面,欢迎大家补充指正 一、Redux 基础概念 为什么需要 Redux? 前端状态管理的挑战(组件间通信、状态共享) Redux 解决的问题:集中式、可预测的状态…

通过多线程同时获取H264和H265码流

目录 一.RV1126 VI采集摄像头数据并同时编码H264、H265的大概流程​编辑​编辑 1.1初始化VI模块: 1.2H264、H265的VENC模块初始化: 1.3VI分别绑定H264的VENC层和H265的VENC层: ​​​​​​​1.4开启H264线程采集H264的VENC数据&#xff…

unity lua属性绑定刷新

我们现在有一个 角色属性类叫heroModel,内容如下,当heroModel中的等级发生变化的时候,我们需要刷新界面显示等级信息,通常我们是在收到等级升级成功的协议的时候,发送一个事件,UI界面接受到这个事件的时候,刷新一下等级…

vscode+vue前端开发环境配置

目录 一、安装Vue二、使用vue新建项目 一、安装Vue 在node.js安装好之后, npm config set registry https://registry.npmmirror.com# 安装vue相关工具,webpack用来项目构建、打包、资源整合等。 npm install webpack -g# 安装vue-cli脚手架 npm insta…

《白帽子讲 Web 安全》之文件操作安全

目录 引言 (一)文件上传与下载漏洞概述 1.文件上传的常见安全隐患 1.1前端校验的脆弱性与服务端脚本执行危机在文件上传流程中,部分开发者可能会在前端使用 JavaScript 代码对文件后缀名进行简单校验,试图以此阻止非法文件上传…

vector习题

完数和盈数 题目 完数VS盈数_牛客题霸_牛客网 一个数如果恰好等于它的各因子(该数本身除外)之和,如:6321。则称其为“完数”;若因子之和大于该数,则称其为“盈数”。 求出2到60之间所有“完数”和“盈数”。 输入描述&#xff…

cesium+vue3自定义HTML实体弹窗、加高德路网、防实体漂浮、让用户画圆、鹰眼

一、基础使用:Cesium.js基础使用(vue)-CSDN博客 1、基础路径 为 Cesium 库设置一个全局变量 CESIUM_BASE_URL,用于指定 Cesium 的资源文件(如 WebGL shaders、纹理、字体等)的 示例场景:假设你…

安全运营的“黄金4小时“:如何突破告警疲劳困局

在当今复杂多变的网络安全环境中,安全团队面临着前所未有的挑战。尤其是面对高级持续性威胁(APT)时,最初的“黄金4小时”成为决定成败的关键窗口。在这段时间内,快速而准确地响应可以极大地降低损失,然而&a…

HTML AI 编程助手

HTML AI 编程助手 引言 随着人工智能技术的飞速发展,编程领域也迎来了新的变革。HTML,作为网页制作的基础语言,与AI技术的结合,为开发者带来了前所未有的便利。本文将探讨HTML AI编程助手的功能、应用场景以及如何利用它提高编程…

Oracle 数据库基础入门(五):限制查询与范式三约定深度解析

在 Oracle 数据库的学习进程中,限制查询与范式三约定是两个极为重要的概念。限制查询帮助我们精准获取特定范围的数据,而范式三约定则为数据库设计提供了科学的指导框架。对于 Java 全栈开发者而言,掌握这些知识不仅有助于高效地从数据库中提…

[BUUCTF]web--wp(持续更新中)

ps:文章所引用知识点链接,如有侵权,请联系删除 [极客大挑战 2019]EasySQL 题目类型:简单SQL注入 发现是登录页面,用万能登录方法测试,两种语句均能解出flag [极客大挑战 2019]Havefun 题目类型:代码审计…

MySQL数据库的数据类型

1.设置MySQL服务器的默认储存引擎 set default_storage_engineMYISAM2. 数值类型 整数类型 TINYINT:1字节,范围:-128~127(有符号),0~255(无符号)。适用于状态码、布尔值&#xff08…

探秘基带算法:从原理到5G时代的通信变革【四】Polar 编解码(二)

文章目录 2.3.3 极化编码巴氏参数与信道可靠性比特混合生成矩阵编码举例 2.3.4 极化译码最小单元译码串行抵消译码(SC译码)算法SCL译码算法 2.3.5 总结**Polar 码的优势****Polar 码的主要问题****Polar 码的应用前景** 2.3.6 **参考文档** 本博客为系列…

迁移过程中,hive元数据字段校对

有时候在迁移过程中,源端字段可能被修改了,这些都存储在元数据库里,通常我们一般配置的hive元数据库都是mysql。所以我们最快的速度查出结果,就是在mysql里查。 然后对比2端表的md5就可以找到哪个表有问题了,再针对这…

计算机基础面试(数据结构)

1. 数组和链表的区别是什么?各自的优缺点是什么? 专业解答: 数组内存连续,支持随机访问,但插入删除效率低;链表内存离散,插入删除高效,但访问需遍历。 初中生版: 数组像…