From: matz@... (Yukihiro Matsumoto) Date: 2003-10-03T10:29:07+09:00 Subject: [ruby-dev:21474] Re: marshalling ivtbl of Time まつもと ゆきひろです In message "[ruby-dev:21176] marshalling ivtbl of Time" on 03/08/11, "NAKAMURA, Hiroshi" writes: |marshal_dumpと_dumpのいずれかが定義されていた場合、 |ivtblの中身がdumpされないことになりましたが(そのほうが嬉しいと |なひも賛成しました)、組み込みクラスの中でおそらく唯一、 |デフォルトで_dumpを持っているTimeはどう扱うべきでしょうか。 なんとなく解決してしまったような気がします。 |t = Time.new; t.instance_eval("@a = 1"); t2 = Marshal.load( | Marshal.dump(t)); p t2.instance_variables | |# => []? ["@a"]? | |過去どうだったか、正確に覚えてはいないのですが、1.6、現行の1.8は |dumpされないものの、半年くらい前の1.8はdumpされたと思います |(なひが以前書いたテストケースが正しければ)。 | |「組み込み型については、marshal_dumpや_dumpをユーザが定義しない限り、 |ivtblはdumpされる」というルールのほうがわかりやすいような気がしますが、 |どうでしょうか。time_dumpはmarshal.cへ? あるいは組み込み型用API新設? |あるいはTimeは特別? 結局、「インスタンス変数を復旧してから_loadあるいは marshal_loadを呼ぶ」というルールにしました。インスタンス変数 をどうにかしたければ、loadルーチンでやれということで。なにも しなければ、そのままインスタンス変数を保存します。