Project1

标题: clone 和 dup 的区别 [打印本页]

作者: 八云紫    时间: 2009-3-19 00:12
标题: clone 和 dup 的区别
帮助手册上是怎么说的
clone
dup
生成物件的副本。clone 返回对象的完整副本,包括冻结状态和特殊方法。而 dup 只有复制对象内容而已。

注意,clone 和 dup 执行的是简单复制。所复制的是对象本身,而不是对象所指的对象(例如数组元素)。


测试代码:

class A
  attr_accessor :timer                  
  def initialize
    @timer = [1,2]
  end
  def show
    p @timer
  end
end
a = A.new
b = a.clone
c = a.dup
p a, b,c
#<A:0x2c90d40 @timer=[1, 2]>
#<A:0x2c90c50 @timer=[1, 2]>
#<A:0x2c90c20 @timer=[1, 2]>

b.show
[1, 2]
c.show
[1, 2]
p a.equal?(b),a.equal?(c),b.equal?(c)
false
false
false

p a == b, a == c, b == c
false
false
false

c.timer = 1
p a == b, a == c, b == c
false
false
false

p a.equal?(b),a.equal?(c),b.equal?(c)
false
false
false


没看出有啥区别。

就是复制没一次成功的说~~~ [LINE]1,#dddddd[/LINE]版务信息:本贴由楼主自主结贴~
作者: 凌冰    时间: 2009-3-19 00:20
dup
生成某对象的拷贝并返回它。clone 生成的是完整的拷贝,它包括 freeze、特殊方法等信息,而 dup 则只拷贝对象的内容。

请注意,clone 和 dup 生成的都是「浅层(shallow)」拷贝。它们只拷贝对象本身,而不会拷贝对象的所指(例如数组的单元等)。

另外,如果对拷贝进行如下测试的话

obj.equal?(obj.clone)

通常都不成立。但是

obj == obj.clone

通常都会成立。


引用F1
作者: 八云紫    时间: 2009-3-19 00:22
问题是, 测试输出的都是 false
作者: 凌冰    时间: 2009-3-19 00:35
因为本身就不是同一个对象了
作者: 八云紫    时间: 2009-3-19 01:02
以下引用凌冰于2009-3-18 16:35:30的发言:

因为本身就不是同一个对象了


那这两个方法有什么区别呢?
作者: Quarcy    时间: 2009-3-19 01:02
重點:clone 生成的是完整的拷贝,它包括 freeze、特殊方法等信息
a = [1,2,3,4]
a.freeze
b = a.dup
c = a.clone
b << 5
c << 5 #<< 出錯
作者: 八云紫    时间: 2009-3-19 01:03
以下引用Quarcy于2009-3-18 17:02:34的发言:

重點:clone 生成的是完整的拷贝,它包括 freeze、特殊方法等信息
a = [1,2,3,4]
a.freeze
b = a.dup
c = a.clone
b << 5
c << 5 #<< 出錯


就是说,在没有 冻结 的时候, 这两者没啥区别?
作者: Quarcy    时间: 2009-6-12 08:00
主要其實還是特殊方法的丟失,不過因為太少用所以不記得特殊方法怎麼添加了(詳細去查API吧)。凍結倒是其次…… [LINE]1,#dddddd[/LINE]系统信息:本贴由楼主认可为正确答案,66RPG感谢您的热情解答~




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1