つまり、
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 とか。判読不能ですが。