[#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:38526] Re: marshal_dump (was Re: )

From: "NAKAMURA, Hiroshi" <nakahiro@...>
Date: 2003-10-13 06:14:19 UTC
List: ruby-list #38526
なひです。

> From: <m_seki@mva.biglobe.ne.jp>
> Sent: Sunday, October 12, 2003 12:43 AM

> > |サブクラスはどうやって救えばいいんだろう。
> > |かっこいい方法ないですかねえ。

> > 今みたいな簡単な方法ではなくて、dumperクラスのようなものを用
> > 意して、それの各メソッド(インスタンス変数のダンプとか)をオー
> > バーライドしてカスタマイズするのがかっこいいとは思います。が、
> > 今のMarshalとの互換性は維持できないでしょうね。

なひはいまひとつ、このまつもとさん提案の方法が、どのようにサブクラスを
救うのか理解できてません。。。

ちなみにJavaでは、dumperが、クラス階層内の各クラスの
writeObjectメソッドをそれぞれ呼んでくれるので(2種類あるserialize
インタフェイスの手軽なほう)、各クラスが、自分で定義した
インスタンス変数(とは呼ばないけど)を書き出すことで、救えます。
writeObjectメソッドが定義されてない場合、デフォルトで全ての
インスタンス変数(同)が書き出されます。

Rubyでもmarshal_dumpを順に呼べないかな、という試みを、
[ruby-dev:21590]あたりでやってみています。うまくいってないんだけど。

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

Rubyでは、インスタンス変数がどのクラスで定義されているか、
あまり意識してない人が多いような気がします(?)。よって咳さんの
書かれてるように、Javaみたいにクラス階層をたどることで債務分割を
するのでなく、一番下位のmarshal_dump/marshal_loadを定義するヤツが
気をつけて全部やれ、とするのもアリだと思います。

ただこうした時の問題は、継承する側は、親クラスが
marshal_dump/marshal_loadを定義してないかどうか常に気をつけないと
いけない、ということであり、JavaのようにSerializableインタフェイスという
マーカなしにdumpできるRubyでは、それ(気をつけないといけないこと)に
気付きにくいということですね(Timeを継承したクラスで_dumpを定義し
忘れておかしなことになったように)。

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

ivarsはやらないんだからextendsもやらない、というのは、仕様がすっきり
してていいと思うんですよね。ただ、[ruby-dev:21592]からのように、
回避方法がないと、どうしても困る場面もでてくるかもしれません
(根拠はありません。誰も困らないかも)。

    /    /    /

関連してひとつ、別の提案ですが、Javaでは、とあるメソッド(readResolve)を
定義しておくと、loadの後に呼んでくれて、そいつが返したオブジェクトを元の
オブジェクトとすりかえる、という機能があります。singletonやenumな
クラスで、loaderが生成した新規オブジェクトを、singletonオブジェクトと
すりかえられます。

こんなのはRubyには要りませんかね?

In This Thread