るびきちです。
テキストでのマーシャリングが欲しいので試しに作ってみました。
どうでしょう?
インターフェースはMarshalとほぼ同じです。
#!/usr/bin/env ruby
module TMarshal
module_function
def dump(obj, port = nil)
dumped = obj.dump_text
if port
port.write dumped
end
dumped
end
def load(port)
eval port.read
end
def restore(port)
load(port)
end
end
################ dump_text for Standard Libraries
class String
alias :dump_text :dump
end
class Array
def dump_text
"[\n"+self.collect{|x| x.dump_text+",\n"}.to_s+"]"
end
end
class Numeric
alias :dump_text :inspect
end
class Hash
def dump_text
"{\n"+self.collect{|k,v| "#{k.dump_text} => #{v.dump_text},\n"}.to_s+"}"
end
end
class TrueClass
def dump_text
"true"
end
end
class FalseClass
def dump_text
"false"
end
end
class NilClass
def dump_text
"nil"
end
end
class Module
alias :dump_text :inspect
end
class Range
alias :dump_text :to_s
end
class Regexp
alias :dump_text :inspect
end
class Symbol
alias :dump_text :inspect
end
class Time
def dump_text
"Time.at(#{self.to_i})"
end
end
if __FILE__ == $0
class C
def initialize(v)
@v = v
end
attr :v
def dump_text
"#{self.type}::new(#{@v.dump_text})"
end
def ==(other)
@v == other.v
end
end
[true, false, nil, Object, :a, /x/, 1..2, 3...4, Time.now].each do |x|
puts TMarshal::dump(x)
end
p eval(TMarshal::dump([true, false, nil, Object, :a, /x/, 1..2, 3...4, Time.at(1)])) == [true, false, nil, Object, :a, /x/, 1..2, 3...4, Time.at(1)]
puts TMarshal::dump([true, false, nil, Object, :a, /x/, 1..2, 3...4, Time.at(1)])
end
るびきち☆
http://voo.to/ruby/ ←Ruby大衆化計画(笑)