3

我不确定在和的文档中“......但不是他们引用的对象”的含义。rubyrubinus

ruby​​-doc中,有解释#clone#dup行为说:

产生 obj 的浅拷贝——拷贝 obj 的实例变量,但不拷贝它们引用的对象。复制 obj 的冻结和污​​染状态。另请参阅 Object#dup 下的讨论。

在Rubinius的实现中重复相同的内容:

复制实例变量,但不递归复制它们引用的对象。复制污点。

我尝试使用以下代码,但行为出乎我的意料。

class Klass
   attr_accessor :array
end

s1 = Klass.new
ar = [1, 2, 3]
s1.array = [ar]

s2 = s1.clone
# according to the doc,
# s2.array should be initialized with empty Array
# however the array is recursivley copied too

s2.array.equal? s1.array # true
4

2 回答 2

3

在 Ruby 中,所有对象都是引用。看看下面的例子:

class Klass
  attr_accessor :a
end

s1 = Klass.new
a = [1,2,3]
s1.a = a
s2 = s1.clone
s1.a.object_id  #=> 7344240 
s2.a.object_id  #=> 7344240 

您可以看到两个数组都是同一个对象,并且都是对位于堆中某处的数组的引用。在深拷贝中,数组本身将被复制,而新s2数组将拥有自己的不同数组。数组没有被复制,只是被引用。

注意: 如果您进行深层复制,则如下所示:

s3 = Marshal.load(Marshal.dump(s1)) #=> #<Klass:0x00000000bf1350 @a=[1, 2, 3, 4], @bork=4> 
s3.a << 5 #=> [1, 2, 3, 4, 5] 
s1 #=> #<Klass:0x00000000e21418 @a=[1, 2, 3, 4], @bork=4> 
于 2013-04-24T13:27:51.957 回答
0

“相等?” 比较检查它们是否是完全相同的对象:

  • == 比较检查两个值是否相等
  • 情商?检查两个值是否相等且类型相同
  • 平等的?检查两个事物是否是同一个对象。

例如 :

a=[1,2]
=> [1, 2] 
a == [1,2]
=> true 
a.eql? [1,2]
=> true 
a.equal? [1,2]
=> false 
a.equal? a
=> true

当您使用 equal 进行测试时?它显示副本没有创建未初始化数组的对象,但它已使复制的对象指向与原始对象相同的数组。如果它递归地复制对象 s2.array 将具有与 s1.array 相同的内容,但将是一个不同的对象,所以:

s2.array.equal? s1.array # false
s2.array.eql? s1.array # true
于 2013-04-24T13:31:30.997 回答