gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:09:29 26 4
gpt4 key购买 nike

我的 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 来制作深拷贝是个好主意吗?

最佳答案

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

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

关于ruby - 为什么 String::sub!() 会更改 Ruby 中克隆对象的原始对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4206177/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com