我在理解浅拷贝和#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;
}
相同的对象,除非它显然不是?
答案 0 :(得分:1)
您忘记==
实际上是来自BasicObject
的方法:
obj == other→true或false
平等 - 在对象级别,==
仅在true
和其他是同一对象时才返回obj
。通常,在子类中重写此方法以提供特定于类的含义。
因此,如果您未提供自己的==
实施方案(即MyObject#==
方法),那么您的:
p myObject1 == myObject1.dup
几乎与说:
p myObject1.object_id == myObject1.dup.object_id
由于myObject1.dup
是myObject1
的浅层副本(即它们是不同的对象),因此您获得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