[問題] 請問object.dup 和object.clone的差別
環境:
Ruby 1.8 + WinXP
狀況:
其實不算是使用上的問題 比較屬於是文件看不懂
想請教一下 object.dup 和 .clone的差別
小弟主要是看安裝完後的 RubyBook Help文件
和中文書 Ruby programming-向Ruby 之父學程式設計
我有在 Observable module中
看到類似
for in in @observer_peers.dup
i.update(*arg)
end
然後 當然要看一下 dup的用法
它的原文文件說明如下
obj.dup -> anObject
Produces a shallow copy of obj---the instance variables of obj are copied,
but not the objects they reference.
dup copies the tainted state of obj.
See also the discussion under Object#clone .
In general, clone and dup may have different semantics in descendent classes.
While clone is used to duplicate an object, including its internal state,
dup typically uses the class of the descendent object
to create the new instance.
這裡是說 obj.dup時 會建立一個新的obj 而該obj會包含原先instance variable的值
但是不會進行COPY的動作 即 如果原先instance variable是指向某一個obj2
那麼不會呼叫 obj2.new 然後存到對應的 instance variable
不知道是不是這個意思? (and "tainted state of obj"該如何解釋?)
還有請問 這裡的 .dup 和 .clone 有差異嗎?
文件裡寫說 including its "internal state"
請問internal state 是指哪個部分??
而在 obj.clone中說
... Copies the frozen and tainted state of obj.
這裡的 "frozen state" 又是指哪個部份?
附錄:
1. Observable的說明在 http://corelib.rubyonrails.org/ class Observable裡
2. obj.clone的範例
class Klass
attr_accessor :str
end
s1 = Klass.new #<Klass:0x401b34f0>
s1.str = "Hello" "Hello"
s2 = s1.clone #<Klass:0x401b320c @str="Hello">
s2.str[1,4] = "i" "i"
s1.inspect "#<Klass:0x401b34f0 @str=\"Hi\">"
s2.inspect "#<Klass:0x401b320c @str=\"Hi\">"
obj.clone了以後 其實還是指到同一個物件 對吧
謝謝您的回應
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.129.27.216
討論串 (同標題文章)
Ruby 近期熱門文章
PTT數位生活區 即時熱門文章