当前位置: 首页 > news >正文

【ruby on rails】dup、deep_dup、clone的区别

一、区别

  • dup

浅复制:dup 方法创建对象的浅复制。
不复制冻结状态:dup 不会复制对象的冻结状态。
不复制单例方法:dup 不会复制对象的单例方法。

  • deep_dup

深复制:deep_dup 方法创建对象的深复制,递归复制嵌套的对象。
需要手动实现:deep_dup 不是 Ruby 内置的方法,通常需要手动实现或使用 ActiveSupport 提供的实现。

  • clone

浅复制:clone 方法创建对象的浅复制。
复制冻结状态:clone 会复制对象的冻结状态。
复制单例方法:clone 会复制对象的单例方法。

二、示例

  • 浅复制的意思是只复制对象的第一层属性,不会递归复制嵌套的对象。
  • 深复制的意思是递归复制嵌套对象
require 'active_support/core_ext/object/deep_dup'# 使用 dup
# 这里 original 是一个包含嵌套哈希的哈希。dup 方法只复制了 original 的第一层属性,因此 dup_copy[:b] 和 original[:b] 仍然引用同一个嵌套哈希 { c: 4 }。所以修改 dup_copy[:b][:c] 也会影响 original[:b][:c]
original = { a: [1, 2, 3], b: { c: 4 } }
dup_copy = original.dup
dup_copy[:b][:c] = 5
puts original[:b][:c] # => 5 (浅复制)original = "hello".freeze
copy = original.dup
copy.frozen? # => false (不复制冻结状态)# 使用 deep_dup
original = { a: [1, 2, 3], b: { c: 4 } }
deep_dup_copy = original.deep_dup
deep_dup_copy[:b][:c] = 6
puts original[:b][:c] # => 4 (深复制)# 使用 clone
original = { a: [1, 2, 3], b: { c: 4 } }
clone_copy = original.clone
clone_copy[:b][:c] = 7
puts original[:b][:c] # => 7 (浅复制)original_str = "hello".freeze
clone_copy = original_str.clone
puts clone_copy.frozen? # => true (复制冻结状态)

三、dup 方法常用场景:通常用于创建对象的浅复制

# 避免修改原始对象
original_array = [1, 2, 3]
copy_array = original_array.dup
copy_array << 4
puts original_array.inspect # => [1, 2, 3]
puts copy_array.inspect     # => [1, 2, 3, 4]# 复制可变对象
original_hash = { a: 1, b: 2 }
copy_hash = original_hash.dup
copy_hash[:c] = 3
puts original_hash.inspect # => {:a=>1, :b=>2}
puts copy_hash.inspect     # => {:a=>1, :b=>2, :c=>3}# 复制对象的状态
class MyClassattr_accessor :value
endoriginal = MyClass.new
original.value = 10
copy = original.dup
copy.value = 20
puts original.value # => 10
puts copy.value     # => 20# 复制 ActiveRecord 对象
original_user = User.find(1)
copy_user = original_user.dup
copy_user.email = "new_email@example.com"
copy_user.save

相关文章:

【ruby on rails】dup、deep_dup、clone的区别

一、区别 dup 浅复制&#xff1a;dup 方法创建对象的浅复制。 不复制冻结状态&#xff1a;dup 不会复制对象的冻结状态。 不复制单例方法&#xff1a;dup 不会复制对象的单例方法。 deep_dup 深复制&#xff1a;deep_dup 方法创建对象的深复制&#xff0c;递归复制嵌套的对象。…...

原生微信小程序画表格

wxml部分&#xff1a; <view class"table__scroll__view"><view class"table__header"><view class"table__header__item" wx:for"{{TableHeadtitle}}" wx:key"index">{{item.title}}</view></…...

Python实现IP代理池

文章目录 Python实现IP代理池一、引言二、步骤一&#xff1a;获取代理IP1、第一步&#xff1a;爬取代理IP2、第二步&#xff1a;验证代理IP的有效性 三、步骤二&#xff1a;构建IP代理池四、使用示例1、完整的使用示例2、注意事项3、处理网络问题 五、总结 Python实现IP代理池 …...

互联网直播/点播EasyDSS视频推拉流平台视频点播有哪些技术特点?

在数字化时代&#xff0c;视频点播应用已经成为我们生活中不可或缺的一部分。监控技术与视频点播的结合正悄然改变着我们获取和享受媒体内容的方式。这一变革不仅体现在技术层面的进步&#xff0c;更深刻地影响了我们。 EasyDSS视频直播点播平台是一款高性能流媒体服务软件。E…...

32.4 prometheus存储磁盘数据结构和存储参数

本节重点介绍 : prometheus存储磁盘数据结构介绍 indexchunkshead chunksTombstoneswal prometheus对block进行定时压实 compactprometheus 查看支持的存储参数 prometheus存储示意图 内存和disk之间的纽带 wal WAL目录中包含了多个连续编号的且大小为128M的文件&#xff0c…...

C7.【C++ Cont】范围for的使用和auto关键字

目录 1.知识回顾 2.范围for 格式 使用 运行结果 运行过程 范围for的本意 作用 注意 3.底层分析范围for的执行过程 反汇编代码 分析 4.auto关键字 格式 基本用法 在范围for中使用auto 1.知识回顾 for循环的使用参见25.【C语言】循环结构之for文章 2.范围for C…...

联通云服务器部署老项目tomcat记录

1.先在服务器上安装mysql和tomcat 2.tomcat修改端口 3.在联通云运控平台配置tomcat访问端口&#xff08;相当于向外部提供可访问端口&#xff09; 4.将tomcat项目放在服务器tomcat的webapps里面 5.在mysql里创建项目数据库&#xff0c;运行sql创建表和导入数据 6.在配置文…...

剪映自动批量替换视频、图片素材教程,视频批量复刻、混剪裂变等功能介绍

一、三种批量替换模式的区别 二、混剪裂变替换素材 三、分区混剪裂变替换素材 四、按组精确替换素材 五、绿色按钮教程 &#xff08;一&#xff09;如何附加音频和srt字幕 &#xff08;二&#xff09;如何替换固定文本的内容和样式 &#xff08;三&#xff09;如何附加…...

el-dialog中调用resetFields()方法重置表单报错

前言 在开发中&#xff0c;弹框和表单是两个常见的组件&#xff0c;它们通常一起使用以实现用户交互和数据输入。然而&#xff0c;当我们尝试在弹框中调用表单的 resetFields() 方法时&#xff0c;有时会遇到报错的情况。 一、用法错误 确保 this.$refs[ruleForm].resetFields…...

分布式系统接口,如何避免重复提交

分布式系统接口&#xff0c;如何避免重复提交 1、基于Token的幂等设计原理实现步骤技术选型 2、基于Token的幂等设计原理实现步骤适用场景 3、幂等性设计原理实现方式 4、分布式锁原理实现方式适用场景 5、请求去重原理实现方式 6.前端防护原理实现方式适用场景 7.延迟队列原理…...

AI 声音:数字音频、语音识别、TTS 简介与使用示例

在现代 AI 技术的推动下&#xff0c;声音处理领域取得了巨大进展。从语音识别&#xff08;ASR&#xff09;到文本转语音&#xff08;TTS&#xff09;&#xff0c;再到个性化声音克隆&#xff0c;这些技术已经深入到我们的日常生活中&#xff1a;语音助手、自动字幕生成、语音导…...

【论文速读】| 人工智能驱动的网络威胁情报自动化

基本信息 原文标题&#xff1a;AI-Driven Cyber Threat Intelligence Automation 原文作者&#xff1a;Shrit Shah, Fatemeh Khoda Parast 作者单位&#xff1a;加拿大圭尔夫大学计算机科学学院 关键词&#xff1a;网络威胁情报&#xff0c;AI自动化&#xff0c;攻击技术和…...

什么是域名监控?

域名监控是持续跟踪全球域名系统&#xff08;DNS&#xff09;中变化以发现恶意活动迹象的过程。组织可以对其拥有的域名进行监控&#xff0c;以判断是否有威胁行为者试图入侵其网络。他们还可以对客户的域名使用这种技术以执行类似的检查。 你可以将域名监控比作跟踪与自己实物…...

vue3 发送 axios 请求时没有接受到响应数据

<script setup> import Edit from ./components/Edit.vue import axios from axios import { onMounted,ref } from vue// TODO: 列表渲染 //装数据的列表 const list ref([]) const count ref(0) const getList async () > {//通过发送 /list 请求从后端拿到列表数…...

前端使用fontfaceobserver库实现字体设置

要使用FontFaceObserver来加载设置项目本地的字体&#xff0c;先确保字体文件位于项目中或者可以从服务端获取到&#xff0c;这样就可以使用FontFaceObserver来检测并加载这些字体 主要有以下几步&#xff1a; npm或者yarn安装引入fontfaceobserver字体资源引入和font-face配置…...

【人工智能】Python常用库-PyTorch常用方法教程

PyTorch 是一个强大的开源深度学习框架&#xff0c;以其灵活性和动态计算图而广受欢迎。以下是 PyTorch 的详细教程&#xff0c;涵盖从基础到实际应用的使用方法。 1. 安装与导入 1.1 安装 PyTorch 访问 PyTorch 官方网站&#xff0c;根据系统、Python 版本和 CUDA 支持选择安…...

Android Studio安装TalkX AI编程助手

文章目录 TalkX简介编程场景 TalkX安装TalkX编程使用ai编程助手相关文章 TalkX简介 TalkX是一款将OpenAI的GPT 3.5/4模型集成到IDE的AI编程插件。它免费提供特定场景的AI编程指导&#xff0c;帮助开发人员提高工作效率约38%&#xff0c;甚至在解决编程问题的效率上提升超过2倍…...

#渗透测试#红蓝攻防#HW#漏洞挖掘#漏洞复现02-永恒之蓝漏洞

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…...

gitlab自动打包python项目

现在新版的gitlab可以不用自己配置runner什么的了 直接写.gitlab-ci.yml文件就行&#xff0c;这里给出一个简单的依靠setup把python项目打包成whl文件的方法 首先写.gitlab-ci.yml文件&#xff0c;放到项目根目录里 stages: # List of stages for jobs, and their or…...

残差神经网络

目录 1. 梯度消失问题 2. 残差学习的引入 3. 跳跃连接&#xff08;Shortcut Connections&#xff09; 4. 恒等映射与维度匹配 5. 反向传播与梯度流 6. 网络深度与性能 总结 残差神经网络的原理是基于“残差学习”的概念&#xff0c;它旨在解决深度神经网络训练中的梯度消…...

档案宝 档案管理系统怎么样?为什么企业选择他?

在当今信息化高速发展的时代&#xff0c;企业档案管理已经从传统的纸质化时代迈向了数字化、智能化的新阶段。随着企业规模的不断扩大和业务类型的日益复杂&#xff0c;档案管理面临着前所未有的挑战&#xff1a;档案数量激增、查找困难、存储空间紧张、安全隐患突出等问题严重…...

别再手动建节点了!用Python+py2neo批量导入三元组到Neo4j的实战避坑指南

Pythonpy2neo批量导入三元组到Neo4j的工程化实践 当数据规模从几十条扩展到数十万条时&#xff0c;单条插入操作就像用滴管给游泳池注水。去年我们团队处理某知识图谱项目时&#xff0c;就曾因不当的批量导入策略&#xff0c;导致原本2小时能完成的任务跑了整整一天。本文将分享…...

如何零配置搭建专业级视觉交互系统:MediaPipe TouchDesigner完全指南

如何零配置搭建专业级视觉交互系统&#xff1a;MediaPipe TouchDesigner完全指南 【免费下载链接】mediapipe-touchdesigner GPU Accelerated MediaPipe Plugin for TouchDesigner 项目地址: https://gitcode.com/gh_mirrors/me/mediapipe-touchdesigner 想要在TouchDes…...

利用VMware虚拟机在本地模拟星图GPU平台环境测试MogFace-large

利用VMware虚拟机在本地模拟星图GPU平台环境测试MogFace-large 想试试最新的MogFace-large人脸检测模型&#xff0c;但手头没有现成的云GPU服务器&#xff1f;或者想先在本地环境里跑通流程&#xff0c;验证一下效果再上云&#xff1f;今天就来分享一个非常实用的方法&#xf…...

蛋白质设计实战:基于RFdiffusion的Motif Scaffolding功能位点定制化设计

1. 认识RFdiffusion与Motif Scaffolding 第一次接触蛋白质设计时&#xff0c;我被这个领域的复杂性震撼到了。20种氨基酸就像乐高积木&#xff0c;但它们的组合方式比宇宙中的星辰还要多。而RFdiffusion就像是一把神奇的钥匙&#xff0c;帮我打开了蛋白质设计的大门。 RFdiffus…...

从g2o优化框架看TEB算法:手撕局部路径规划的图优化实现

从g2o优化框架看TEB算法&#xff1a;手撕局部路径规划的图优化实现 在机器人导航领域&#xff0c;局部路径规划算法的性能直接决定了机器人在动态环境中的反应速度和避障能力。TEB&#xff08;Timed Elastic Band&#xff09;算法作为ROS生态中广泛采用的解决方案&#xff0c;其…...

5个创新方法:基于开源工具的内容访问优化方案

5个创新方法&#xff1a;基于开源工具的内容访问优化方案 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在信息爆炸的数字时代&#xff0c;合法访问优质内容成为信息获取的关键挑战。…...

告别小白屏!树莓派3.5寸/5寸屏幕驱动安装全攻略(含HDMI/GPIO款区分与镜像下载)

树莓派外接屏幕终极指南&#xff1a;从驱动安装到故障排查一站式解决 树莓派爱好者们常常会遇到一个令人头疼的问题——当你兴冲冲地连接上一块3.5寸或5寸的小屏幕&#xff0c;期待立即开始项目开发时&#xff0c;迎接你的却是一片刺眼的白屏。这种情况在非官方屏幕中尤为常见&…...

BERT文本分割-中文模型企业应用:内容平台文档结构化

BERT文本分割-中文模型企业应用&#xff1a;内容平台文档结构化 1. 引言&#xff1a;为什么需要文本分割技术 在日常工作中&#xff0c;我们经常会遇到这样的情况&#xff1a;会议记录、访谈稿、讲座内容等长篇口语文字材料缺乏段落结构&#xff0c;阅读起来十分困难。这些由…...

Plausible Analytics:隐私友好型网站统计完全指南:Google Analytics替代方案

Plausible Analytics&#xff1a;隐私友好型网站统计完全指南&#xff1a;Google Analytics替代方案 背景 网站分析是网站运营优化的重要基础。Google Analytics 作为最广泛使用的网站分析工具&#xff0c;提供了强大的数据洞察能力。然而&#xff0c;GA 存在诸多问题&#x…...