あおきです。
In mail "[ruby-list:30208] Re: .dup がされてないらしい ?"
Atsushi Kanaya <todo-a2c / mizar.freemail.ne.jp> wrote:
> 金谷です。
>
> > eachgraph がコンテナのように見えますが、dup で deep copy して
> > ないということでは。
>
> コンテナというのはブロック変数、という意味でいいんですよね?
違います。eachgraph が指しているオブジェクトがコンテナだという
ことです。適当に言うと、インスタンス変数を使ってるオブジェクトは
全部コンテナです。
> これをdupすれば深いコピーができると思ったのですが
> どうも浅いコピーの方になってしまうようです。
dup は浅いコピーをするのが仕様です。そうなっている理由は、リンクが
循環している場合にうまい解決方法がない、などです。深いコピーをする
には Marshal を使って
duplicated = Marshal.load( Marshal.dump(obj) )
とするのが定石となってます (Marshal は循環リンクも正しく扱う)。
あるいは eachgraph のレベルだけ値が保持できればいいのなら専用の
dup メソッドを書いてもいいです。
-------------------------------------------------------------------
青木峰郎