2007-04-17 [Ruby][clone]
■[Ruby][clone]深いコピーの作成(3)
深いコピーの作成(2) - pegacornの日記
作業用のインスタンス変数が衝突する可能性があった問題を解決した。
clone.rb
#!ruby class Object def deep_clone _deep_clone({}) end protected def _deep_clone(cloning_map) return cloning_map[self] if cloning_map.key? self cloning_obj = clone cloning_map[self] = cloning_obj cloning_obj.instance_variables.each do |var| val = cloning_obj.instance_variable_get(var) begin val = val._deep_clone(cloning_map) rescue TypeError next end cloning_obj.instance_variable_set(var, val) end cloning_map.delete(self) end end class Array protected def _deep_clone(cloning_map) return cloning_map[self] if cloning_map.key? self cloning_obj = super cloning_map[self] = cloning_obj cloning_obj.map! do |val| begin val = val._deep_clone(cloning_map) rescue TypeError # end val end cloning_map.delete(self) end end class Hash protected def _deep_clone(cloning_map) return cloning_map[self] if cloning_map.key? self cloning_obj = super cloning_map[self] = cloning_obj pairs = cloning_obj.to_a cloning_obj.clear pairs.each do |pair| pair.map! do |val| begin val = val._deep_clone(cloning_map) rescue TypeError # end val end cloning_obj[pair[0]] = pair[1] end cloning_map.delete(self) end end
トラックバック - http://d.hatena.ne.jp/pegacorn/20070417/1176817721
リンク元
- 98 http://www.cslog.cn/Content/ruby-deep-clone/
- 64 http://www.cslog.cn/Content/ruby-deep-clone
- 28 http://hi.baidu.com/rubyonrailsjie/blog/item/0838d1768fb4da11b151b90c.html
- 9 http://www.cslog.cn/category/ruby-on-rails/
- 8 http://www.cnzzad.com/tut/47802.html
- 3 http://d.hatena.ne.jp/keyworddiary/Ruby
- 2 http://www.cslog.cn/Content/2008/12/
- 2 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&q=ruby+clone&btnG=検索&lr=lang_ja
- 2 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLJ,GGLJ:2006-35,GGLJ:ja&q=深いコピー
- 2 http://yiyanwan77.iteye.com/blog/1464755