あづみです。

nobu.nakada / nifty.ne.jp wrote:
>  こんな意味でしょうか。まぁこれでは複数回参照されてるオブジェ
> クトがうまく扱えませんが。
> 
>  class Foo
>     alias _dump_ _dump
>     def _dump(*args)
>       dup_to_dump._dump_(*args)
>     end
>   end

Object#_dump って定義されていないですよね?

#<Foo:0x81477bc @foo=1> なオブジェクトの _dump を書くのはさほど難しく
はないですが、
#<Foo:0x81353a0 @foo=#<Bar:0x8135378 @bar=#<Baz:0x8135350>>>
とかどんどん深くなっていくと _dump 書くのも難しくなってきます。そんな
のはできれば書きたくない。

irb(main):001:0> foo
#<Foo:0x81353a0 @foo=#<Bar:0x8135378 @bar=1>>

で、Bar の @bar が Marshal::dump で出力する必要の無いデータの場合、

irb(main):002:0> Marshal::dump(foo)
"\004\006o:\010Foo\006:\t@fooo:\010Bar\000"   # @bar は出力されない
irb(main):003:0> Marshal::load(Marshal::dump(foo))
#<Foo:0x81353a0 @foo=#<Bar:0x8135378>>

というのが簡単に実装できたらいいなと思ってるわけです。実際に
#<Bar:0x8135378 @bar=1> が出力される直前に Bar#_dup_to_dump なりが呼
ばれて #<Bar:0x8147848> を返して実際はそれが出力されれば良いかなと。

自分のやろうとしてることってものすごく特殊なことなんでしょうか。
それだけでも収穫ではあります。

# 個人的にはそんなに直感から外れてないと思ってるんですけど


安積伸弥
adzumi / denpa.org