2016-11-17 98 views
0

我有一些无法理解的浅表副本的概念和#dup方法.dup是否真的创建了一个浅拷贝?

我有这样的代码

class MyObject 
end 

myObject1 = MyObject.new 
myObject2 = MyObject.new 

我知道这监守我为对象进行相等性测试将打印错误,不珍惜平等

p myObject1 == myObject2 

但根据的浅表副本definition

.dup生成obj的浅拷贝 - obj的实例变量被复制,但不是它们引用的对象。

我曾预计此项打印真实的,但它也打印假

p myObject1 == myObject1.dup 

是不是定义错了呢?不应该myObject1.dupinstance variable指向与myObject1相同的对象,但它显然不是?

回答

1

你忘了==实际上是从BasicObject方法:

OBJ ==其他→真或假
平等 - 在对象级别,==回报true只有obj等是同一个对象。通常,这个方法在后代类中被覆盖以提供类特定的含义。

所以,如果你没有提供自己实现==(即MyObject#==方法),那么你:

p myObject1 == myObject1.dup 

是几乎相同的话说:

p myObject1.object_id == myObject1.dup.object_id 

和因为myObject1.dupmyObject1的浅表副本(即它们是不同的对象),所以您获得false

当他们说:

obj实例变量被复制

他们指的是实例变量obj,而不是发生在引用obj变量。您的myObject1在任何情况下都不是实例变量,它只是一个变量,实例变量以@my_instance_variable中的前导@引用。

如果你想==表现他们的方式,你指望它,那么你必须提供自己的==实现:

class MyObject 
    def ==(other) 
    # Check that the contents of `self` and `other` are the same 
    # and probably that `other.is_a?(MyObject)` first. 
    end 
end 
+0

不正是我是问。我的意思是说,这个定义是不是'.dup产生了一个obj的浅拷贝 - obj的实例变量被复制,而不是它们引用的对象。'暗示'p myObject1 == myObject1.dup'应该打印真实?基本上,语言听起来像'.dup'复制指针,但它们仍指向同一个对象。得到我现在要求的? –

+0

哦,上帝,我是个白痴。非常感谢! –

+1

但是'myObject'只是一个变量(不是实例变量),文档说'dup'复制了*'obj'中的实例变量*。 'myObject1'和'myObject1.dup'是完全不同的对象,你没有提供你自己的'=='所以'myObject1 == myObject1.dup'是'false'。我还给我的答案加了一点澄清,所以我会忽略那个白痴。 –