首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么String :: sub!()会更改Ruby中克隆对象的原始内容?

这个问题涉及到Ruby编程语言中的字符串操作和对象克隆的知识。在Ruby中,字符串是不可变的,这意味着一旦创建了一个字符串,它的内容就不能更改。然而,当我们克隆一个字符串时,我们实际上是创建了一个新的字符串,它与原始字符串共享相同的内容。因此,当我们对克隆的字符串进行操作时,我们实际上是在创建一个新的字符串,而不是更改原始字符串的内容。

在这个问题中,String::sub!()方法是用于在原始字符串上进行替换操作的。当我们使用这个方法时,它会直接修改原始字符串的内容,而不是创建一个新的字符串。因此,如果我们对一个克隆的字符串使用String::sub!()方法,我们实际上是在更改原始字符串的内容,而不是克隆对象的内容。

为了避免这种情况,我们可以使用String::sub()方法,它会创建一个新的字符串,而不是修改原始字符串的内容。这样,我们就可以安全地对克隆对象进行操作,而不会影响原始字符串的内容。

总之,String::sub!()方法会更改Ruby中克隆对象的原始内容,因为它直接修改原始字符串的内容,而不是创建一个新的字符串。为了避免这种情况,我们应该使用String::sub()方法来创建一个新的字符串,而不是修改原始字符串的内容。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Vue的computed和watch的细节全面分析

,发现oldVal和newVal值是一样的,所以深度监听虽然可以监听到对象的变化,但是无法监听到具体对象里面那个属性的变化 3.oldVal和newVal值一样的原因是它们索引同一个对象/数组。...3.4 存在的问题 复杂数据类型在栈中存贮的是指针,所以赋值给新的变量也会改变原始的变量值.那么应该咋整呢?...var x = function(){console.log(1);}; var y = x; y = function(){console.log(2);}; x(); //1 y(); //2 为什么函数可以直接赋值克隆...由于函数对象克隆之后的对象会单独复制一次并存储实际数据,因此并不会影响克隆之前的对象。所以采用简单的复制“=”即可完成克隆。...$set(arr,1,true)对应的值耶不更新, 这个很坑,这个bug我找个很久 如果传入的值只是在data定义,并未在methods或生命周期钩子更改,直接改变也会报错 所以还是可以先用局部变量接收

1.9K20

Java中clone方法的使用

什么是clone   在实际编程过程中,我们常常要遇到这种情况:有一个对象object1,在某一时刻object1中已经包含了一些有效值,此时可能会需要一个和object1完全相同新对象object2,...这也解释了为什么要用Object中clone()方法而不是先new一个类,然后把原始对象中的信息赋到新对象中,虽然这也实现了 clone功能。...由此我们可以推断,调用clone方法产生的效果是:现在内存中开辟一块和原始对象一样的空间,然后拷贝原始对象中的内容。...但是对于基本数据类型,这样的操作是没有问题的,但对于非基本类型,它们保存的仅仅是对象的引用,这就是为什么clone后的非基本类型变量和原始对象中相应的变量会指向的是同一个对象。...这是因为String被 Sun公司的工程师写成了一个不可更改的类(immutable class),在所有String类中的函数都不能更改自身的值。

75330
  • Java Getter和Setter

    Getter是一种读取变量值的方法。Getter和setter 在Java 中也称为访问器和更改器。 2.为什么我们需要Getter和Setter?...现在,在第4行中,我们可以 按如下所示修改数组中第二个元素 的值myScores: myScores[1] = 1; 由于第4行的赋值,第二个元素的值从5更改为1。为什么重要?...因为这意味着可以在setter方法范围之外修改数据,这破坏了setter的封装目的。为什么会这样呢?...将原始集合中的克隆项添加到新集合中。 8.为自己的类型实现getter和setter 如果定义对象的自定义类型,则应clone() 为自己的类型实现该 方法。...从getter返回一个克隆的对象。 在设置器中分配一个克隆的对象。 结论 Java 中的 getter 和 setter 看起来很简单,但是如果天真地实现,可能会变得很危险。

    7K11

    C# 9.0新特性介绍

    虽然建议使用不可变的值类型,但可变的值类型通常不会引入错误。 值类型变量可保存值,因此在将值类型传递给方法时,会对原始数据的副本进行更改。 不可变的引用类型也有许多优点。...Teacher(string first, string last, string sub) : base(first, last) => Subject = sub; } 还可密封记录以防止进一步派生...合成的“克隆”方法支持用于记录层次结构的副本构造。 “克隆”一词用引号引起来,因为实际名称是编译器生成的。 无法在记录类型中创建名为 Clone 的方法。...在 C# 9.0 中,已知创建对象的类型时,可在 new 表达式中省略该类型。...此更改意味着 foreach 与其他基于模式的构造(例如异步模式和基于模式的析构)一致。实际上,此更改意味着可以为任何类型添加 foreach 支持。在设计中,应将其限制为在枚举对象有意义时使用。

    2K20

    Java的深拷贝和浅拷贝

    ④、利用 Clone 方法   Clone 是 Object 类中的一个方法,通过 对象A.clone() 方法会创建一个内容和对象 A 一模一样的对象 B,clone 克隆,顾名思义就是创建一个一模一样的对象出来...从第 5 行和第 6 行打印的对象内容看,原对象 p1 和克隆出来的对象 p2 内容完全相同。   ...代码中我们只是更改了克隆对象 p2 的属性 Address 为湖北省荆州市(原对象 p1 是湖北省武汉市) ,但是从第 7 行和第 8 行打印结果来看,原对象 p1 和克隆对象 p2 的 Address...深拷贝的原理我们知道了,就是要让原始对象和克隆之后的对象所具有的引用类型属性不是指向同一块堆内存,这里有三种实现思路。   ...这里写到流中的对象则是原始对象的一个拷贝,因为原始对象还存在 JVM 中,所以我们可以利用对象的序列化产生克隆对象,然后通过反序列化获取这个对象。

    1.4K70

    Java深拷贝和浅拷贝

    对象拷贝有哪些 对象拷贝(Object Copy)就是将一个对象的属性拷贝到另一个有着相同类类型的对象中去。在程序中拷贝对象是很常见的,主要是为了在新的上下文环境中复用对象的部分或全部数据。...: " + stud.getName() + " - " + stud.getSubj().getName()); System.out.println("更新原始对象后的克隆对象: "...更新后的原始对象: 小杨逗比 - 潇湘剑雨大侠 更新原始对象后的克隆对象: 杨充 - 潇湘剑雨大侠 Disconnected from the target VM, address: '127.0.0.1...更新后的原始对象: 小杨逗比 - 潇湘剑雨大侠 更新原始对象后的克隆对象: 杨充 - 潇湘剑雨大侠 Disconnected from the target VM, address: '127.0.0.1...// 查看每一个现在的内容 System.out.println("查看原始的对象 = " + c1); System.out.println("查看复制的对象

    79320

    Java中的深克隆和浅克隆

    为什么要克隆 首先思考一个问题, 为什么需要克隆对象? 直接new一个对象不行吗?...简单说, 深克隆不仅克隆了当前对象, 还把当前对象所引用的对象都复制了一遍. Object中的clone Object类中的clone()方法属于浅克隆....它的工作原理如下: 在内存中先开辟一块和原始对象相同的空间, 然后复制原始对象的内容....可以看到, 对象确实不是原来的对象了, 但是其中的引用对象却还是原来的对象. 浅克隆对于引用对象仅拷贝引用. 如果一个对象只包含原始数据或者不可变对象域(如: String), 推荐使用浅克隆....Java序列化克隆 如果引用类型中海包括引用类型, 要实现多层克隆会很麻烦, 这使用可以使用序列化和反序列化的方式实现对象的深克隆.

    1.7K10

    C# 9.0 中的新增功能

    虽然建议使用不可变的值类型,但可变的值类型通常不会引入错误。 值类型变量可保存值,因此在将值类型传递给方法时,会对原始数据的副本进行更改。 不可变的引用类型也有许多优点。...Teacher(string first, string last, string sub) : base(first, last) => Subject = sub; } 还可密封记录以防止进一步派生...合成的“克隆”方法支持用于记录层次结构的副本构造。 “克隆”一词用引号引起来,因为实际名称是编译器生成的。 无法在记录类型中创建名为 Clone 的方法。...在 C# 9.0 中,已知创建对象的类型时,可在 new 表达式中省略该类型。...通过该信息,它将新代码添加到编译中。 源生成器只能添加代码,不能修改编译中的任何现有代码。 为代码生成器添加的两项功能是分部方法语法和模块初始化表达式的扩展。 首先是对分部方法的更改。

    1.7K20

    ADO.NET 2.0 中的新增 DataSet 功能

    本页内容 简介 原始性能 DataTable — 比以前更独立 流到缓存,缓存到流 小结 简介 在即将问世的 ADO.NET 版本(ADO.NET 2.0)中,有很多新增的和改进的功能,它们影响了很多不同的...如果 PreserveChanges 保留它的默认值 false,则合并操作会重写原始 DataTable 中的行的原始值和当前值,并且所作的所有更改都将丢失。...用户希望获得修改后的 DataTable,并且在保持所作更改(当前值)的同时,将它的内容(仅限于原始值)与主数据源重新同步。 • 情况 3 — 聚合来自一个或多个辅助数据源的增量数据馈送。...它将 DataTable 的内容作为 DataTableReader(派生自 DBDataReader)对象返回。...假定 DataSet 中的“customers”表的内容显示在第一个网格中,则该例程会显示刚刚创建的、只包含那些由 DefaultView(由它的筛选器参数所指定)公开的行的 DataTable。

    3.2K100

    java cloneable 用途_java中cloneable的使用「建议收藏」

    大家好,又见面了,我是你们的朋友全栈君。 什么是java中的浅克隆和深克隆? 浅克隆:克隆对象中的变量与之前对象的值相同,并且对象中的引用类型变量仍然指向原来对象引用类型变量的地址....深克隆:克隆对象中的变量与之前对象的值相同,并且对象中的引用类型变量指向了新的对象的引用变量的地址....,是一个新的对象,所以克隆对象中的name和age是新的....,表明了克隆对象的引用型变量animal并未发生改变,也即使内存中的地址并未发生改变,所以对其name的更改会影响原对象与克隆对象的值....,表明了克隆对象的引用型变量animal发生改变,也即内存中的地址发生改变,所以对其name的更改不会影响克隆对象的值.同时说明了进行深克隆会把所有的引用类型都实现cloneable接口,如果克隆对象中的引用类型变量比较多的话

    51220

    GitHub 使用手册 - 基础篇

    GitHub 网站采用 Ruby on Rails 架构,在 Web 设计中运用了大量的 JavaScript、AJAX、HTML5 等技术,支持对使用 Markdown 等标记语言的内容进行渲染和显示等...README 文件里有关于你这个项目详细的解释,或者添加一些关于如何安装或者使用该项目的文档。README 文件的内容会自动地显示在你仓库的首页。 让我们提交一个对 README 文件的修改。...4、在新内容的上方,点击 Preview changes。 ? 5、检查一下你对这个文件进行的更改,你会看到新的内容被绿色标记。 ?...Fork 一个示例仓库 Fork 是对一个仓库的克隆。克隆一个仓库允许你自由试验各种改变,而不影响原始的项目。...第三步:通过配置 Git 来同步你 fork 的原始 Spoon-Knife 仓库 当你 fork 一个项目是为了提出更改这个原始的仓库,你可以配置 Git 将原始的或者 upstream 的变化更改到你本地

    1.6K80

    Java复制 | Java随笔记

    一、直接赋值 在 Java 中,A a1 = a2,我们需要理解的是这实际上复制的是引用,也就是说 a1 和 a2 指向的是同一个对象。因此,当 a1 变化的时候,a2 里面的成员变量也会跟着变化。...因此,原始对象及其副本引用同一个对象。...序列化就是将对象写到流的过程,写到流中的对象是原有对象的一个拷贝,而原对象仍然存在于内存中。 通过序列化实现的拷贝不仅可以复制对象本身,而且可以复制其引用的成员对象。...因此通过序列化将对象写到一个流中,再从流里将其读出来,可以实现深克隆。...d学生信息 更改了姓名            clone.getStudent().setName("我是克隆对象更改后的大鱼2");            System.out.println("

    36500

    Java的克隆

    但实际情况是,当我们对 student1的 name进行更改时,student2的值就会被一起改变。 上面这个其实只是引用复制,大家都指向堆里的同一个引用,自然当数据发生变化时也会一起改变。...那么如何正确复制对象呢,这里就得说一下Java的Clone。 克隆 Java的克隆允许复制一个一模一样内容的对象出来,当改变A内容时,被克隆的B的内容不会一起改变。 为什么要克隆呢?...其实很简单,当我们复制了一个对象的引用,新对象的数据在发生变更时会同时修改原对象的数据。而这并不是我们想要的,我们只想修改新对象的数据。克隆可以解决这种场景。 这里面有两种克隆,浅克隆和深克隆。...深克隆 - deep clone 当情况变的更复杂一点,比如在Student里引入一个对象 Subject class Subject { String title; } class Student...如果我们想把克隆对象里的非基本类型也一并克隆的话,那么需要把引用的类型也同样实现克隆接口。

    55320

    在 JavaScript 中对象的深拷贝(及其工作原理)

    对象是 JavaScript 最重要的元素之一,深入理解了它会使你在编码时得心应手。在克隆对象时,它并不像看起来那么简单。 当你不想改变原始对象时,就需要克隆对象。...例如,如果你有一个接受对象并改变它的函数,可能不想改变其原始对象。...现在对于大多数初学者来说,他们会试着通过将 testObject 分配给新变量来创建这个对象的副本,以便在其代码中进行操作。很抱歉用这种方法行不通。 下面是一个代码片段,说明了为什么不起作用。...你对所谓的副本做的任何更改也将反映在原始对象中。 循环遍历对象并将每个属性复制到新对象也不起作用。...这意味着如果更改复制对象中的嵌套对象,原始对象也会更改。 4. 不复制任何属性描述符。

    2.3K30

    java 通过Object的clone复制对象

    java 通过Object的clone复制对象 需求背景 对象的克隆是指创建一个新的对象,且新的对象的状态与原始对象的状态相同。当对克隆的新对象进行修改时,不会影响原始对象的状态。...浅复制,clone()内部类似于创建一个新的对象并把对象中相应的字段通过赋值给新的对象,而引用数据类型的内容本身并不是克隆的,因此这种复制就叫浅复制。...那么 代码重现 增加Study对象 改造Person对象 运行程序 运行结果 可以看到p2更改的基础属性地址信息不影响p1的,但是p2更改的Study对象属性却会影响...对象的复制 这就是深复制 再次运行copy3()查看运行结果 这里可以看到p2对study属性的更改不再影响p1中study的属性。...到这里基本问题都解决了,但是还可能会遇到一个问题,就是当前对象中有很多引用对象,这样的话通过clone的方法处理起来会比较麻烦,这是可以采用另外一种方式,序列化的方式来实现对象的深复制。

    9810

    objectable_java throwable

    不幸的是,向Cloneable添加”克隆”方法将是一种不兼容的更改。它不会破坏二进制兼容性,但会破坏源兼容性。轶事证据表明,在实践中,有许多类支持Cloneable接口,但无法提供公共克隆方法。...因此,仅仅通过实现该接口的事实来克隆对象是不可能的。即使反射调用clone方法,也无法保证它会成功。 #2 热门回答(63 赞) 简单回答”为什么不是Cloneable贬低?”...(或者实际上,为什么not1111428949已经过去,对于任何X而言)是因为对它们的弃用并没有太多关注。 最近弃用的大部分内容都已弃用,因为有一个特定的计划要删除它们。...这将告诉开发人员他们可能想要寻找其他地方,但它不会表明在将来的版本中可能会删除克隆机制。不幸的是,不存在这样的标记。...你在错误的地方问。 在Java API中保留此内容的原因是什么? 由于向后兼容性要求,没有人会从Java API中删除任何内容。

    43040

    Ruby学习笔记

    nil 是一个特殊值,用于在正则表达式中表示没有找到匹配的内容。也就是说,0 在ruby中也是真值。...Hash的key理论上可以是任何对象,但是实际当中,我们一般选择Numberic、String、Date等做为key值,因为这样的key值在比较中更为准确,而其他的对象是否一致的比较则相对复杂。...Ruby中提供了获取key、value的批量及迭代方式,方便我们获取对象中的内容。 正则表达式类(Regexp) 正则表达式的历史可以追溯到科学家对人类神经系统工作原理的早期研究。...String类提供了sub、gsub、scan三个方法可以接收正则表达式对象。 IO类 IO是每个程序语言必不可少的部分,通常IO有三个,标准输入、标准输出、错误输出。...Time、Date、DateTime类 如果不熟悉的人,看到这三个类,一定会问为什么要这么多关于时间处理的类? Ruby中的进程与线程 Fiber、Thread、Process。

    2K20
    领券