字体:  

对象消失了?

pinemail 发表于: 2008-11-05 17:50 来源: Ruby Community

定义了两个对象,将第二个对象赋值给第一个对象后,第一个对象会消失吗?
以下是测试代码:
class Song
    def initialize(name,artist,duration)
        @name = name
        @artist = artist
        @duration = duration
    end
    def to_s
        "Song: #@name --#@artist (#@duration)"
    end
    attr_accessor :name, :artist, :duration
end
song = Song.new("My way","BeiJing",180)
song1 = Song.new("I ok.","That is right.",280)
puts song.to_s
song = song1
puts song.to_s
song1.name = "I ok too."
puts song.to_s
结果,song.to_s显示结果是Song: I ok too. --That is right. (280)
我的问题是song和song1内容这时完全是一样的,为什么这样呢?原来song的对象消失了吗?

最新回复

karon_flame at 2008-11-06 09:32:21
不是的..

不能这么写.

错在这里..

song = song1

这个的意思是song1的Object_id赋给song

Object_id我的理解是一个内存地址的指针.

应该用克隆才可以.
sonng = song.colon

[ 本帖最后由 karon_flame 于 2008-11-6 10:33 编辑 ]
pinemail at 2008-11-06 10:18:34
嗯,现在知道原因了,song和song1都是对象的一个引用,所以,song = song1实际上是让song指向song1的对象,所以才会出现这种情况。
但是我的问题是采用song = song1后,song原来指向的对象去哪了?是自动消失了吗?
如果仅仅是为了将song1的对象值赋给song的对象,可以采用song = song1.dup来操作,就不会出现上面的问题了。
对karon_flame回复中提到的colon方法,没找到相关的定义。
karon_flame at 2008-11-06 10:36:09
sorry   colon貌似是java的..
或许是吧
我有点忘记了...

不好意思
pinemail at 2008-11-06 13:00:24
karon_flame你的意思我大概是清楚的,大家思路也是相同的,我现在是有些不太明白,Ruby中的对象是不是会随时消失?如果采用song = song1的写法,那song原来所指的对象去哪了?