2003-08-21 [長年日記]

_1 [Ruby] Array#dump, Hash#dump

つまり、

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

_2 [Ruby][tDiary] アップデート

さきほど、第二 tDiary.Net の ruby を ruby-1.8.0 (2003-08-19) にアップデートしました。

本日のツッコミ(全2件) [ツッコミを入れる]
_ ただただし (2003-08-21 12:50)

Arrayの要素にユーザ定義クラスのインスタンス(など)が含まれている場合には、evalできないよん

_ mput (2003-08-21 15:23)

def dump; 'Marshal.load ' + marshal.dump(self).dump; end とか。判読不能ですが。

[]