查看: 1020|回复: 7

clone 和 dup 的区别

  [复制链接]

神隐的主犯

梦石
0
星屑
553
在线时间
271 小时
注册时间
2008-2-22
回帖
7534

贵宾

发表于 2009-3-19 00:12:57 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
帮助手册上是怎么说的
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


没看出有啥区别。

就是复制没一次成功的说~~~
版务信息:本贴由楼主自主结贴~

《天空之城 —— 破碎的命运》

冰王子

梦石
0
星屑
50
在线时间
34 小时
注册时间
2008-1-27
回帖
1810
发表于 2009-3-19 00:20:23 | 显示全部楼层
dup
生成某对象的拷贝并返回它。clone 生成的是完整的拷贝,它包括 freeze、特殊方法等信息,而 dup 则只拷贝对象的内容。

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

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

obj.equal?(obj.clone)

通常都不成立。但是

obj == obj.clone

通常都会成立。


引用F1
不常在线,有事PM
回复

使用道具 举报

神隐的主犯

梦石
0
星屑
553
在线时间
271 小时
注册时间
2008-2-22
回帖
7534

贵宾

 楼主| 发表于 2009-3-19 00:22:33 | 显示全部楼层
问题是, 测试输出的都是 false

《天空之城 —— 破碎的命运》
回复

使用道具 举报

冰王子

梦石
0
星屑
50
在线时间
34 小时
注册时间
2008-1-27
回帖
1810
发表于 2009-3-19 00:35:30 | 显示全部楼层
因为本身就不是同一个对象了
不常在线,有事PM
回复

使用道具 举报

神隐的主犯

梦石
0
星屑
553
在线时间
271 小时
注册时间
2008-2-22
回帖
7534

贵宾

 楼主| 发表于 2009-3-19 01:02:26 | 显示全部楼层
以下引用凌冰于2009-3-18 16:35:30的发言:

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


那这两个方法有什么区别呢?

《天空之城 —— 破碎的命运》
回复

使用道具 举报

梦石
0
星屑
50
在线时间
54 小时
注册时间
2008-5-12
回帖
124
发表于 2009-3-19 01:02:34 | 显示全部楼层
重點:clone 生成的是完整的拷贝,它包括 freeze、特殊方法等信息
a = [1,2,3,4]
a.freeze
b = a.dup
c = a.clone
b << 5
c << 5 #<< 出錯
你是個好人>////<
回复

使用道具 举报

神隐的主犯

梦石
0
星屑
553
在线时间
271 小时
注册时间
2008-2-22
回帖
7534

贵宾

 楼主| 发表于 2009-3-19 01:03:56 | 显示全部楼层
以下引用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 #<< 出錯


就是说,在没有 冻结 的时候, 这两者没啥区别?

《天空之城 —— 破碎的命运》
回复

使用道具 举报

梦石
0
星屑
50
在线时间
54 小时
注册时间
2008-5-12
回帖
124
发表于 2009-6-12 08:00:00 | 显示全部楼层
主要其實還是特殊方法的丟失,不過因為太少用所以不記得特殊方法怎麼添加了(詳細去查API吧)。凍結倒是其次……
系统信息:本贴由楼主认可为正确答案,66RPG感谢您的热情解答~
你是個好人>////<
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部