From: "NAKAMURA, Hiroshi" Date: 2003-10-10T11:59:42+09:00 Subject: [ruby-dev:21592] Re: extend with marshal_dump/marshal_load なひです。 > From: "Yukihiro Matsumoto" > Sent: Friday, October 10, 2003 11:43 AM > |marshal_dump/marshal_loadが定義されていると、ivar同様、 > |extendもdumpされませんが、これは仕様でいいでしょうか。 > > 仕様だと思います。marshal_dumpを定義するということは、その辺 > は自分でカバーするという意思表明だと考えます。 了解です。 それはさておき、自分でカバーしたいのは確かなんですが、現時点では 方法がみつからない。。。 差し迫っているわけではなく、local(private?) instance variableが 入ったら、きっとこんな仕組みが要るんだろうと思って実験してみて ました。マーシャルフォーマットをどう変更することになるのかな、と。 インスタンス変数がどこで定義されているか、調べる方法はありましたっけ。。。 class Foo def initialize @data_a = 1 @r, @w = IO.pipe end def marshal_dump obj = [] obj << @data_a extends = (class << self; self; end).ancestors - self.class.ancestors obj << extends # ↓すでに呼ばれてるのでこんなことしてちゃ駄目。 extends.each do |m| obj << m.instance_method(:marshal_dump).bind(self).call end end def marshal_load(obj) @data_a = obj.shift extends = obj.shift extends.reverse_each do |m| self.extend(m) m.instance_method(:marshal_load).bind(self).call(obj.shift) end end end class Bar < Foo def initialize super @data_b = 2 end def marshal_dump obj = super obj << @data_b obj end def marshal_load(obj) super @data_b = obj.shift end end module Baz def marshal_dump super << @data_c end def marshal_load(obj) @data_c = obj end end o1 = Bar.new o1.extend(Baz) o2 = Marshal.load(Marshal.dump(o1))