組み込みクラス: Marshal

このクラスに関してはそれほど内容は濃くはない。

Rubyのオブジェクトは条件付きで文字列化することが出来る。ただし条件はかなり限られていて、

  • 名前のついていないクラスやモジュール
  • File, Dir, IOなどシステムがオブジェクトの状態を保持するもの
  • MatchData, Proc, Threadクラスのインスタンス
  • 特異メソッドが定義された、インスタンス

はマーシャルdumpすることができない。

いろいろ変換出来て面白い。

def dumping(arg)
  string1 = Marshal.dump(arg)
  p string1
  return string1
end

def loading(arg)
  p Marshal.load(arg)
end

class C 
  def hello
    p "hello"
  end
end

klass = dumping(C)
loading(klass).new.hello
"\x04\bc\x06C"
C
"hello"

rationalとかはどうなのかな。

rational = 1/3r
conv = dumping(rational)
loading(conv)
"\x04\bU:\rRational[\ai\x06i\b"
(1/3)

Threadはやはりdumpできない。

t = Thread.new{
  sleep 3000
}

conv = dumping(t)
loading(t).new
thread.rb:119:in `dump': no _dump_data is defined for class Thread (TypeError)
        from thread.rb:119:in `dumping'
        from thread.rb:140:in `<main>'

なるほど。