[問題] 請問object.dup 和object.clone的差別

看板Ruby作者 (softwind rising)時間17年前 (2007/05/26 10:56), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/3 (看更多)
環境: 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
文章代碼(AID): #16Lw71hT (Ruby)
文章代碼(AID): #16Lw71hT (Ruby)