In article <1074477335.411187.19623.nullmailer / picachu.netlab.jp>,
  matz / ruby-lang.org (Yukihiro Matsumoto) writes:

> 特異メソッドが付いているとそのオブジェクトの挙動が変化するの
> でdump/loadで意味が保存される保証がない、というのが特異メソッ
> ドを持つオブジェクトがdumpできない理由なのですが、クラスに特
> 異メソッドが付いていてもそのオブジェクトの挙動は変化しないの
> で、禁止する理由はないと思います。

marshal というのは、あるオブジェクトからたどれるものをすべて書き出すも
のであり、特異クラスもたどれることには違いないため、そのオブジェクトの
挙動が変化しないという理由は納得し難いものがあります。

たどれるからにはたどれる先のオブジェクトの挙動に依存して挙動が変化する
こともあり得るのではないでしょうか。まぁ、あまりないとも思いますけれど。

そーか、あるインスタンス変数を dump したくないときには、marshal_dump
を使わなくても、特異クラスの特異クラスのインスタンス変数に記録しておけ
ばいいのか?

... と思って試してみたら次のようにちゃんと失敗してしまいます。

% ruby -e 'o = Object.new
class << o
  class << self
    @a = STDIN
  end
end
p Marshal.dump(o)
'
-e:7:in `dump': can't dump anonymous class #<Class:0x401bdea8> (TypeError)
        from -e:7

... と思ったらどうやら次のように常に失敗するようになっているようで、こ
れは意図されていない挙動ではないかと思います。

% ruby -e 'o = Object.new
class << o
end
p Marshal.dump(o)
'
-e:4:in `dump': can't dump anonymous class #<Class:0x401bdf84> (TypeError)
        from -e:4
-- 
[田中 哲][たなか あきら][Tanaka Akira]