[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dennou-ruby:000099] Re: deep copy



ごとけんです

In message "[dennou-ruby:000098] deep copy"
    on 99/09/23, Takeshi Horinouchi <horinout@xxxxxx> writes:

>dup って shallow なコピーですよね。deep なコピーをとる方法はない

そうですね、組み込みではないです。一般的には相互に参照しあう
場合もあるから deep copy は難しいし、原理的に copy 出来ない
Method のようなオブジェクトもあるので、ケースバイケースで作
らないといけないでしょう。

>でしょうか。完全 deep でなくて良くて一層だけ、つまり、直接のイン
>スタンス変数に関してだけ dup してくれればいいのですが。
>
>気分は
>
>  instance_variables.each{|i| i=org.i.dup}
>
>みたいな感じです(このままじゃ全然駄目だけど)。

汎用のを作るより、クラスごとに自作のコピーメソッドを付けたほ
うが楽かも。汎用ならこんな感じかなぁ。ただしコンテナには対応
してません。

module DeepCopieable
  def deep_copy
    res = self.dup
    instance_variables.each{|v| 
      res.instance_eval "#{v} = #{v}.clone" 
    }
    res
  end
end

class Foo
  include DeepCopieable
  attr_accessor :a, :b
end

foo = Foo.new
foo.a = "helo"
foo.b = ["hi"]
bar = foo.deep_copy
p [foo.a.id, bar.a.id] # id returns an unique value for each objects
p [foo.b[0].id, bar.b[0].id]  # containers are not supported

-- gotoken