设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 813|回复: 7
打印 上一主题 下一主题

clone 和 dup 的区别

 关闭 [复制链接]

Lv2.观梦者

神隐的主犯

梦石
0
星屑
299
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

跳转到指定楼层
1
发表于 2009-3-19 00:12:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

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


没看出有啥区别。

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

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

Lv1.梦旅人

冰王子

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

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

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

obj.equal?(obj.clone)

通常都不成立。但是

obj == obj.clone

通常都会成立。


引用F1
不常在线,有事PM
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

梦石
0
星屑
299
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

3
 楼主| 发表于 2009-3-19 00:22:33 | 只看该作者
问题是, 测试输出的都是 false

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

Lv1.梦旅人

冰王子

梦石
0
星屑
50
在线时间
34 小时
注册时间
2008-1-27
帖子
1875
4
发表于 2009-3-19 00:35:30 | 只看该作者
因为本身就不是同一个对象了
不常在线,有事PM
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

梦石
0
星屑
299
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

5
 楼主| 发表于 2009-3-19 01:02:26 | 只看该作者
以下引用凌冰于2009-3-18 16:35:30的发言:

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


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

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
54 小时
注册时间
2008-5-12
帖子
129
6
发表于 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 #<< 出錯
你是個好人>////<
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

梦石
0
星屑
299
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

7
 楼主| 发表于 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 #<< 出錯


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

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

Lv1.梦旅人

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

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2025-1-12 06:50

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表