PrettyPrintの出力先等を変えてみる、ちなみに

HashをPrettyPrintしたいけど、Prettyにならない場合があることをレイジ君から聞いたので、一応メモ。あまり必要ないかもしれないが。

>> pp hs
{:i=>9, :b=>2, :k=>11, :j=>10, :e=>5, :g=>7, :d=>4, :f=>6, :c=>3, :h=>8, :a=>1}

>> hs.merge!({:l => 12})
=> {:i=>9, :b=>2, :l=>12, :k=>11, :j=>10, :e=>5, :g=>7, :d=>4, :f=>6,
:c=>3, :h=>8, :a=>1}
>> pp hs
{:i=>9,
:b=>2,
:l=>12,
:k=>11,
:j=>10,
:e=>5,
:g=>7,
:d=>4,
:f=>6,
:c=>3,
:h=>8,
:a=>1}
=> nil
>>

>> pp ary
["1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "1", "2", "3", "4", "5"]
>> ary = %w(1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6)
=> ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "1", "2", "3", "4", "5", "6"]
>> pp ary
["1",
"2",
(中略)
"5",
"6"]
=> nil
>>

>> pp [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6]
=> nil
>> pp [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7]
[1,
2,
3,
(中略)
6,
7]
=> nil
>>

HashもArrayも79バイトまでだと改行しない。ということ。ただし、要素の区切りには1バイトのスペースがあり、Hashの場合はkeyと valueの間にスペースがない状態で、79バイトというのが仕様のようだ。どうしても79バイト以下のオブジェクトをPrettyPrintしたい場合は、Kernel#ppではなく、以下のようにする。

>> PP.pp [1,2,3], $>, 5
[1,
2,
3]
=> #<IO:0x2946af4>

pp.rbをみると、

def PP.pp(obj, out=$>, width=79)
  q = PP.new(out, width)
  q.guard_inspect_key {q.pp obj}
  q.flush
  #$pp = q
  out << "\n"
end

となっているので。PPクラスのクラスメソッドppに明示的にwidthを指定して実行すれば、79バイト以下でも整形してくれる。ちなみに出力先も変えられる

>> f = File.open("c:/ikou/test.txt", "w+")
>> PP.pp [1,2,3], f, 5
>> f.close