Ruby 1.9.3 リファレンスマニュアル > ライブラリ一覧 > ppライブラリ > PPクラス

class PP + PrettyPrint

クラスの継承リスト: PP < PrettyPrint < Object < Kernel < BasicObject

要約

オブジェクトなどを見やすく出力するためのクラスです。

特異メソッド

format(output = '', maxwidth = 79, newline = "\n", genspace = lambda{|n| ' ' * n}) {|pp| ...} -> object

PrettyPrint オブジェクトを生成し、それを引数としてブロックを実行します。 与えられた output を返します。

以下と同じ働きをするもので簡便のために用意されています。

begin
  pp = PrettyPrint.new(output, maxwidth, newline, &genspace)
  ...
  pp.flush
  output
end
[PARAM] output:
出力先を指定します。output は << メソッドを持っていなければなりません。
[PARAM] maxwidth:
行の最大幅を指定します。ただし、改行できないものが渡された場合は、 実際の出力幅は maxwidth を越えることがあります。
[PARAM] newline:
改行に使われます。
[PARAM] genspace:
空白の生成に使われる Proc オブジェクトを指定します。 生成したい空白の幅を表す整数を引数として呼ばれます。
new(output = '', maxwidth = 79, newline = "\n") -> PrettyPrint
new(output = '', maxwidth = 79, newline = "\n") {|width| ...} -> PrettyPrint

pretty printing のためのバッファを生成します。 output は出力先です。output は << メソッドを持っていなければなりません。 << メソッドには

のどれかひとつが引数として与えられます。

ブロックが指定された場合は、空白を生成するために使われます。ブロックは、生成したい空白の幅を表す整数を引数として呼ばれます。ブロックが指定されない場合は、空白を生成するために {|width| ' ' * width} が使われます。

[PARAM] output:
出力先を指定します。output は << メソッドを持っていなければなりません。
[PARAM] maxwidth:
行の最大幅を指定します。ただし、改行できないものが渡された場合は、実際の出力幅は maxwidth を越えることがあります。
[PARAM] newline:
改行に使われます。
pp(obj, out = $>, width = 79) -> object

指定されたオブジェクト obj を出力先 out に幅 width で出力します。 出力先 out を返します。

[PARAM] obj:
表示したいオブジェクトを指定します。
[PARAM] out:
出力先を指定します。<< メソッドが定義されている必要があります。
[PARAM] width:
出力先の幅を指定します。
str = PP.pp([[:a, :b], [:a, [[:a, [:a, [:a, :b]]], [:a, :b],]]], '', 20)
puts str
#=>
[[:a, :b],
 [:a,
  [[:a,
    [:a, [:a, :b]]],
   [:a, :b]]]]

[SEE_ALSO] $>

sharing_detection -> bool
sharing_detection=(boolean)

共有検出フラグを表すアクセサです。 デフォルトは false です。true である場合、 PP.pp は一度出力したオブジェクトを再び出力する時 Object#pretty_print_cycle を使います。

[PARAM] boolean:
共有検出フラグを true か false で指定します。

例:

require 'pp'
b = [1, 2, 3]
a = [b, b]

pp a                        #=> [[1, 2, 3], [1, 2, 3]]

PP.sharing_detection = true
pp a                        #=> [[1, 2, 3], [...]]
singleline_format(output = '', maxwidth = 79, newline = "\n", genspace = lambda{|n| ' ' * n}) {|pp| ...} -> object

PrettyPrint オブジェクトを生成し、それを引数としてブロックを実行します。 PrettyPrint.format に似ていますが、改行しません。

引数 maxwidth, newline と genspace は無視されます。ブロック中の breakable の実行は、 改行せずに text の実行であるかのように扱います。

[PARAM] output:
出力先を指定します。output は << メソッドを持っていなければなりません。
[PARAM] maxwidth:
無視されます。
[PARAM] newline:
無視されます。
[PARAM] genspace:
無視されます。
singleline_pp(obj, out=$>) -> object

指定されたオブジェクト obj を出力先 out に出力します。 ただし、インデントも改行もしません。 出力先 out を返します。

[PARAM] obj:
表示したいオブジェクトを指定します。
[PARAM] out:
出力先を指定します。<< メソッドが定義されている必要があります。

インスタンスメソッド

breakable(sep = ' ') -> ()
breakable(sep, width = sep.length) -> ()

「必要ならここで改行出来る」ということを自身に通知します。 もしその位置で改行されなければ、width カラムのテキスト sep が出力の際にそこに挿入されます。

[PARAM] sep:
改行が起きなかった場合に挿入されるテキストを文字列で指定します。
[PARAM] width:
テキスト sep は width カラムであると仮定されます。指定されなければ、 sep.length が利用されます。例えば sep が多バイト文字の際に指定する必要があるかも知れません。
comma_breakable -> ()

以下と等価な働きをするもので簡便のために用意されています。

text ','
breakable

[SEE_ALSO] PrettyPrint#text, PrettyPrint#breakable

first? -> bool

このメソッドは obsolete です。

現在のグループで first? に対する最初の呼び出しかどうかを判定する 述語です。これはカンマで区切られた値を整形するのに有用です。

pp.group(1, '[', ']') {
  xxx.each {|yyy|
    unless pp.first?
      pp.text ','
      pp.breakable
    end
    ... pretty printing yyy ...
  }
}
flush -> ()

バッファされたデータを出力します。

genspace -> Proc

空白を生成する Proc を返します。

group(indent = 0, open_obj = '', close_obj = '', open_width = open_obj.length, close_width = close_obj.length) {...} -> ()

与えられたブロックを実行します。 ブロック内で自身に追加される文字列やオブジェクトは、1行にまとめて表示しても よい同じグループに属すると仮定されます。

もう少し詳しく説明します。pretty printing アルゴリズムはインデントと改行を、 ツリー構造を作ることによって決定します。そして、group メソッドは子ノードの作成と 子ノードのインデントの深さの決定を担当します。

同じノード内で呼ばれた breakable は、改行するならば全て同時に改行します。

[PARAM] indent:
グループのインデントの深さを指定します。
[PARAM] open_obj:
指定された場合、self.text(open_obj, open_width) がブロックが 実行される前に呼ばれます。開き括弧などを出力するのに使用されます。
[PARAM] close_obj:
指定された場合、self.text(close_obj, close_width) がブロックが 実行された後に呼ばれます。閉じ括弧などを出力するのに使用されます。
[PARAM] open_width:
open_obj のカラムを指定します。
[PARAM] close_width:
close_obj のカラムを指定します。
indent -> Integer

現在のインデントの深さを返します。

maxwidth -> Integer

自身の幅を返します。

nest(indent) {...} -> ()

自身の現在のインデントを indent だけ増加させてから、ブロックを実行し、元に戻します。

[PARAM] indent:
インデントの増加分を整数で指定します。
newline -> String

自身の改行文字を返します。

object_group(obj) { ... } -> ()

以下と等価な働きをするもので簡便のために用意されています。

group(1, '#<' + obj.class.name, '>') { ... }
[PARAM] obj:
表示したいオブジェクトを指定します。

[SEE_ALSO] PrettyPrint#group

output -> object

自身の output を返します。

pp(obj) -> ()

指定されたオブジェクト obj を Object#pretty_print を使って自身のバッファに追加します。

obj がすでに、現在のノードの親において出力されていた場合には、 参照のループが存在しているので、Object#pretty_print の代わりに Object#pretty_print_cycle が使われます。

[PARAM] obj:
表示したいオブジェクトを指定します。
seplist(list, sep = lambda { comma_breakable }, iter_method = :each) {|e| ...} -> ()

リストの各要素を何かで区切りつつ、自身に追加していくために使われます。

list を iter_method によってイテレートし、各要素を引数としてブロックを実行します。 また、それぞれのブロックの実行の合間に sep が呼ばれます。

つまり、以下のふたつは同値です。

q.seplist([1,2,3]) {|v| q.pp v }

q.pp 1
q.comma_breakable
q.pp 2
q.comma_breakable
q.pp 3
[PARAM] list:
自身に追加したい配列を与えます。iter_method を適切に指定すれば、 Enumerable でなくても構いません。
[PARAM] sep:
区切りを自身に追加するブロックを与えます。list がイテレートされないなら、 sep は決して呼ばれません。
[PARAM] iter_method:
list をイテレートするメソッドをシンボルで与えます。

[SEE_ALSO] PP#comma_breakable

text(obj) -> ()
text(obj, width = obj.length) -> ()

obj を width カラムのテキストとして自身に追加します。

[PARAM] obj:
自身に追加するテキストを文字列で指定します。
[PARAM] width:
obj のカラムを指定します。指定されなかった場合、obj.length が利用されます。
class PP