2007-04-12 [Ruby][clone]
■[Ruby][clone]深いコピーの作成(2)
深いコピーの作成(1)
組み込みクラス Array, Hash 用のメソッドを作ってみた。
clone.rb
#!ruby class Object def deep_clone return @deep_cloning_obj if @deep_cloning @deep_cloning_obj = clone @deep_cloning_obj.instance_variables.each do |var| val = @deep_cloning_obj.instance_variable_get(var) begin @deep_cloning = true val = val.deep_clone rescue TypeError next ensure @deep_cloning = false end @deep_cloning_obj.instance_variable_set(var, val) end deep_cloning_obj = @deep_cloning_obj @deep_cloning_obj = nil deep_cloning_obj end end class Array def deep_clone return @deep_cloning_obj if @deep_cloning @deep_cloning_obj = super @deep_cloning_obj.map! do |val| begin @deep_cloning = true val = val.deep_clone rescue TypeError # ensure @deep_cloning = false end val end deep_cloning_obj = @deep_cloning_obj @deep_cloning_obj = nil deep_cloning_obj end end class Hash def deep_clone return @deep_cloning_obj if @deep_cloning @deep_cloning_obj = super pairs = @deep_cloning_obj.to_a @deep_cloning_obj.clear pairs.each do |pair| pair.map! do |val| begin @deep_cloning = true val = val.deep_clone rescue TypeError # ensure @deep_cloning = false end val end @deep_cloning_obj[pair[0]] = pair[1] end deep_cloning_obj = @deep_cloning_obj @deep_cloning_obj = nil deep_cloning_obj end end
実行例1
require 'clone' class Foo end class Bar end obj = [Foo.new, Bar.new] p obj # => [#<Foo:0x100ed494>, #<Bar:0x100ed480>] p obj.clone # => [#<Foo:0x100ed494>, #<Bar:0x100ed480>] p obj.deep_clone # => [#<Foo:0x100ed340>, #<Bar:0x100ed318>]
実行例2
require 'clone' class Foo end class Bar end obj = {Foo.new => Bar.new, Foo.new => Bar.new} p obj # => {#<Foo:0x100ed3a4>=>#<Bar:0x100ed390>, #<Foo:0x100ed37c>=>#<Bar:0x100ed368>} p obj.clone # => {#<Foo:0x100ed3a4>=>#<Bar:0x100ed390>, #<Foo:0x100ed37c>=>#<Bar:0x100ed368>} p obj.deep_clone # => {#<Foo:0x100ed188>=>#<Bar:0x100ed160>, #<Foo:0x100ed138>=>#<Bar:0x100ed110>}
トラックバック - http://d.hatena.ne.jp/pegacorn/20070412/1176381225
リンク元
- 221 http://www.ruby-forum.com/topic/110750
- 33 http://www.google.co.jp/search?q=ruby+深いコピー&sourceid=navclient-ff&ie=UTF-8&rls=GGGL,GGGL:2006-22,GGGL:ja
- 29 http://www.megasolutions.net/ruby/Deep-Copy-78309.aspx
- 28 http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/43424
- 20 http://raa.ruby-lang.org/project/deep-clone/
- 20 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLD,GGLD:2005-13,GGLD:ja&q=ruby+深いコピー
- 18 http://www.google.co.jp/search?q=ruby+clone&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox
- 17 http://www.google.co.jp/search?hl=ja&q=ruby+深いコピー&lr=
- 17 http://www.kakueki.com/ruby/list.html
- 12 http://www.google.com/search?hl=en&source=hp&btnG=Google+Search&q=ruby deep clone