[#38470] ruby-dev summary 21403-21530 (draft) — Minero Aoki <aamine@...>

青木です。

25 messages 2003/10/07
[#38475] Re: ruby-dev summary 21403-21530 (draft) — maili31s@... (SugHimsi==SUGIHARA Hiroshi) 2003/10/07

すぎむし。

[#38480] Re: ruby-dev summary 21403-21530 (draft) — Minero Aoki <aamine@...> 2003/10/08

青木です。

[#38481] marshal_dump (was Re: ) — m_seki@... 2003/10/08

[#38484] Re: marshal_dump (was Re: ) — matz@... (Yukihiro Matsumoto) 2003/10/09

まつもと ゆきひろです

[#38486] Re: marshal_dump (was Re: ) — Masatoshi Seki <m_seki@...> 2003/10/09

咳といいます

[#38489] exit status on exit! — YANAGAWA Kazuhisa <kjana@...4lab.to>

<http://www.unixuser.org/~ysjj/diary/?200310a&to=200310082#200310082>

29 messages 2003/10/09
[#38490] Re: exit status on exit! — Koji Arai <JCA02266@...> 2003/10/09

新井です。

[#38503] Re: exit status on exit! — YANAGAWA Kazuhisa <kjana@...4lab.to> 2003/10/10

In Message-Id: <20031010.082218.74733862.JCA02266@nifty.ne.jp>

[#38505] Re: exit status on exit! — Koji Arai <JCA02266@...> 2003/10/10

新井です。

[#38507] Re: exit status on exit! — matz@... (Yukihiro Matsumoto) 2003/10/11

まつもと ゆきひろです

[#38514] Re: exit status on exit! — YANAGAWA Kazuhisa <kjana@...4lab.to> 2003/10/11

In Message-Id: <1065883639.405037.23137.nullmailer@picachu.netlab.jp>

[#38515] Re: exit status on exit! — WATANABE Hirofumi <eban@...> 2003/10/11

わたなべです。

[ruby-list:38508] Re: marshal_dump (was Re: )

From: m_seki@...
Date: 2003-10-11 15:43:54 UTC
List: ruby-list #38508
咳といいます。BMarshal(ABLoad)を思い出してきた…


> In message "[ruby-list:38486] Re: marshal_dump (was Re: )"
>     on 03/10/09, Masatoshi Seki <m_seki@mva.biglobe.ne.jp> writes:
> 
> |サブクラスはどうやって救えばいいんだろう。
> |かっこいい方法ないですかねえ。
> 
> 今みたいな簡単な方法ではなくて、dumperクラスのようなものを用
> 意して、それの各メソッド(インスタンス変数のダンプとか)をオー
> バーライドしてカスタマイズするのがかっこいいとは思います。が、
> 今のMarshalとの互換性は維持できないでしょうね。


よくある使い方は、
  * 特別なインスタンス変数を出力しない、あるいは、
    別の値を出力する
だと思います。

そこで、デフォルトで全部のインスタンス変数を保持したオブジェクト
(たとえばHash)を返すようにして、カスタマイズする方で出力しない、
または別の値に取り替えるように調整するのはどうでしょう?


[ruby-dev:21590]のextendの件はmarshal.cで気を使ってくれると
良いように思うけど、どうなのかしら。


class Object
  def default_marshal_dump
    desc = {}
    instance_variables.each do |name|
      desc[name] = instance_variable_get(name)
    end
    desc
  end

  def default_marshal_load(desc)
    desc.each do |name, value|
      next unless String === name
      next unless name[0] == ?@
      instance_variable_set(name, value)
    end
  end
end

class Foo
  def initialize
    @data_a = 1
    @r, @w = IO.pipe
  end

  def marshal_dump
    desc = default_marshal_dump
    desc.delete('@r')
    desc.delete('@w')
    desc
  end

  def marshal_load(desc)
    default_marshal_load(desc)
    @r, @w = IO.pipe
  end
end

class Bar < Foo
  def initialize
    super
    @data_b = 2
  end
end

o1 = Bar.new
o2 = Marshal.load(Marshal.dump(o1))
p o1
p o2


marshal.cがObject#marshal_dumpがあってもカスタマイズと思わないで
くれるようにできれば、Object#default_marshal_dumpは、marshal_dumpに
改名して、Foo#marshal_dumpからは
   desc = super
と呼びたいところです。

Rubyのプリミティブや拡張ライブラリで、インスタンス変数ではない
なにかを持ってるなら、desc[:primitive]とかにしまうようにするとか‥
Structもなにかしないとだめかも。



In This Thread