【问题标题】:Why does String::sub!() change the original of a cloned object in Ruby?为什么 String::sub!() 会更改 Ruby 中克隆对象的原始内容?
【发布时间】:2023-03-25 10:25:01
【问题描述】:

我的 Ruby 代码中有一个结构,看起来有点像这样

Parameter = Struct.new(:name, :id, :default_value, :minimum, :maximum)

稍后,我使用

创建了这个结构的一个实例
freq = Parameter.new('frequency', 15, 1000.0, 20.0, 20000.0)

在某些时候,我需要这个结构的完全副本,所以我调用

newFreq = freq.clone

然后,我改变newFreq的名字

newFreq.name.sub!('f', 'newF')

这也奇迹般地改变了freq.name!

像newFreq.name = 'newFrequency' 这样的简单赋值不会改变freq。

这是应该的工作方式吗?

编辑:使用类而不是结构并重载clone 来进行深层复制是个好主意吗?

【问题讨论】:

    标签: ruby clone string-substitution


    【解决方案1】:

    newFreq 是freq 的浅拷贝。这意味着存储在newFreq 中的每个引用都指向对象,就像存储在freq 中的引用一样。您可以单独更改引用指向的位置 (newFreq.name = newFreq.name.sub 'f','newF'),但如果您调用改变对象的方法,newFreq 和 freq 都会受到影响。

    另见http://en.wikipedia.org/wiki/Object_copy

    【讨论】:

      【解决方案2】:

      Object#clone 方法执行浅拷贝。您需要深拷贝才能完成工作。

      关注this link,了解 Ruby 中的深拷贝。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-21
        • 2017-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-27
        • 2015-01-23
        • 2012-11-24
        相关资源
        最近更新 更多