2007-04-18 [Ruby][clone]
■[Ruby][clone]深いコピーの作成(4)
深いコピーの作成(3) - 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_obj end end class Array protected def _deep_clone(cloning_map) return cloning_map[self] if cloning_map.key? self cloning_obj = super cloning_obj.map! do |val| begin val = val._deep_clone(cloning_map) rescue TypeError # end val end cloning_obj end end class Hash protected def _deep_clone(cloning_map) return cloning_map[self] if cloning_map.key? self cloning_obj = super 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_obj end end
トラックバック - http://d.hatena.ne.jp/pegacorn/20070418/1176824538
リンク元
- 52 http://raa.ruby-lang.org/project/deep-clone/
- 9 http://raa.ruby-lang.org/project/deep-clone/0.2.1
- 6 http://d.hatena.ne.jp/keyworddiary/Ruby
- 4 http://www.google.co.jp/search?q=ruby+深いコピー&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a
- 3 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLD,GGLD:2005-13,GGLD:ja&q=ruby+深いコピー
- 3 http://www.google.co.jp/search?sourceid=navclient-ff&ie=UTF-8&rls=GGGL,GGGL:2006-42,GGGL:ja&q=ruby+clone+深い
- 2 http://64.233.183.104/search?q=cache:w1gwzuxfSJEJ:raa.ruby-lang.org/project/deep-clone/+ruby+deep+clone&hl=en&ct=clnk&cd=1&client=firefox-a
- 2 http://d.hatena.ne.jp/
- 2 http://search.yahoo.co.jp/search?p=ruby+深いコピー&ei=UTF-8&fr=top_ga1&x=wrt
- 2 http://thinkinweb.heroku.com/