[ruby-list:48686] Re: klass と Marshal.load(Marshal.dump klass) が同じにならない

From: dezawa <dezawa@...>
Date: 2012-04-07 11:17:00 UTC
List: ruby-list #48686
出沢です
ありがとうございます。

> 正直なところ情報が少なくてなんともいいがたいのですが、
> Marshalはクラスやモジュールは中身をコピーするのではなく名前で
> 参照します。ですから、同じプロセスでこの2つが違うというのは
> あまり考えにくいのですが。object_idとかでこの2つが本当に同
> じものか確認していただけませんか?

object_id では同じにならなかったです。82984630 と 83271850 でした。


どういう情報が必要か分からないので、とりあえずどのように調べたか、を述べ
ます。
1) klass == Marshal.load(Marshal.dump klass) をどう調べたか
2) pp したデータはどう採ったか
3) object_id はどうなのか(まつもと さんの質問に答えて)


1) klass == Marshal.load(Marshal.dump klass) をどう調べたか
 RDoc::Generator::Ri を cp した RDoc::Generator::Latex にて
  generate に次の記述があります。

    RDoc::TopLevel.all_classes_and_modules.each do |klass|
      :
      :
    end

   ここに、
     pp klass ==  Marshal.load(Marshal.dump klass)

    を入れ、
    rdoc -f latex /some/path/ube_plan.rb
  として、結果をみました。

2) pp したデータはどう採ったか
 RDoc::RI::Store#save_class の最後が
    marshal = Marshal.dump klass

    open path, 'wb' do |io|
      io.write marshal
    end
 となっています。
 ここを次の様に変えました。

    marshal = Marshal.dump klass

    pp klass
    pp Marshal.load marshal

    open path, 'wb' do |io|
      io.write marshal
    end

 RDoc::RI::Store#save_method についても同じようにしました。

 そのうえで、
 rdoc -f ri /some/path/ube_plan.rb としてこのスレッドTopでpostしたpp
データを採りました。

3) 1) の pp の後に、
   pp [klass.object_id,(Marshal.load(Marshal.dump klass)).object_id]
   として
      rdoc -f latex /some/path/ube_plan.rb
   としました。
   [82984630, 83271850] となりました。


In This Thread