From: Hideto ISHIBASHI Date: 2000-06-27T13:42:02+09:00 Subject: [ruby-list:23535] Re: dump a single object 石橋"rubyholic"秀仁です。 咳さんの RefMarshal を参考にさせていただいています。 ところで、これは「あらゆる」クラスに対応できていますか。 実用上は問題なさそうなので、使わせていただきます。 しかし、ごく一部の例外があるような気がしました。 次の命題は「偽」ですよね。 「どんなクラスも、インスタンス変数の参照関係をたどれば、 最終的には組込みクラスに還元されます」 反例は拡張ライブラリで提供される String のようなクラスです。 # RefMarshal は上記の方法にもとづきますよね。 RefMarshal のような機構は、「そういう例外的なクラス」を 知っている必要があります。しかし、拡張ライブラリで追加される クラス事前に把握することはできませんよね。 この問題になんとか対応しようとすれば、 インスタンス変数が: ある -> それらを再帰的にたどる。そのオブジェクト自身はダンプせず。 ない -> そのオブジェクト自身をダンプする。 という対応でよいでしょうか。 「なんとか」と言ったのは対応しきれないクラスがあるからです。 「インスタンス変数があり、インスタンス変数以外の情報がある」 クラスには対応できません。そんなクラスは「使うほうが悪い」 として切り捨てようかなと (^^; String の情報が「どこ」にあるか Ruby から判別できないように、 対応する方法はありませんよね。 ちょっと補足: 直列化の観点からクラスを分類すると: A. インスタンス変数を持たないクラス 例1(組み込み):String, 例2(空のクラス):class Foo;end B. インスタンス変数以外の情報を持つクラス 例:Cで書かれた一部のクラス。とくに組み込み。 ほとんどの組込みクラス(String, Array, Hash, ...)は、 「A かつ B」ですね。組み合わせは4通りありますけど、 やっかいなのが「(not A) かつ B」です。苦し紛れの対策は上述。 -- Hideto "rubyholic" ISHIBASHI http://www.rr.iij4u.or.jp/~hideto-i/ blade clone: http://www.rr.iij4u.or.jp/~hideto-i/rb/yaiba/index.html