.dup真的会创建一个浅层副本吗?

时间:2016-11-17 02:49:57

标签: ruby

我在理解浅拷贝和#dup方法

的概念时遇到了一些麻烦

我有这段代码

class MyObject
end

myObject1 = MyObject.new
myObject2 = MyObject.new

我知道这会打印false因为我正在测试对象的相等性,而不是值相等

p myObject1 == myObject2

但是根据浅版本的definition

  

.dup生成obj的浅表副本 - 复制obj的实例变量,但不复制它们引用的对象。

我原本以为打印为true,但也打印错误

p myObject1 == myObject1.dup

这个定义不对吗?不应该myObject1.dup instance variable myObject1指向与 #nav-brand-bg { background-color: red; width: 100px; height: 100px; position: relative; } #navwrap { position: absolute; width: 90%; } #trapezoid { border-top: 100px solid black; border-left: 50px solid transparent; border-right: 50px solid transparent; -webkit-transform: skew(-27deg); -moz-transform: skew(-27deg); -o-transform: skew(-27deg); height: 0; width: 100px; left: -25px; position: relative; } #bar { width: 100%; background-color: black; height: 40px; position: absolute; top: 30px; }相同的对象,除非它显然不是?

1 个答案:

答案 0 :(得分:1)

您忘记==实际上是来自BasicObject的方法:

  

obj == other→true或false
  平等 - 在对象级别,==仅在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