つまり、
String#dump
--- dump
文字列中の非表示文字をバックスラッシュ記法に置き換えた文字列を
返します。str == eval(str.dump) となることが保証されています。
puts "abc\r\n\f\x00\b10\\\"".dump #=> "abc\r\n\f\000\01010\\\""
の Array 版や Hash 版が欲しいのですが、
class Array
def dump
self.inspect.gsub(/#/, '\#')
end
end
という定義で array = eval(array.dump) が保証されるのかな。
irb(main):001:0> class Array
irb(main):002:1> def dump
irb(main):003:2> self.inspect.gsub(/#/, '\#')
irb(main):004:2> end
irb(main):005:1> end
=> nil
irb(main):006:0> a = ['1', 2, nil, '#{c}']
=> ["1", 2, nil, "#{c}"]
irb(main):007:0> a.dump
=> "[\"1\", 2, nil, \"\\#{c}\"]"
irb(main):008:0> b = eval(a.dump)
=> ["1", 2, nil, "#{c}"]
irb(main):009:0> a == b
=> true
Arrayの要素にユーザ定義クラスのインスタンス(など)が含まれている場合には、evalできないよん
def dump; 'Marshal.load ' + marshal.dump(self).dump; end とか。判読不能ですが。