要約
Psych が中間データとして利用している AST (Abstract Syntax Tree) に関するモジュール。
Psych.load によって YAML ドキュメントを Ruby オブジェクトに変換するときには、一度中間的な AST に変換され、その AST が Ruby のオブジェクトに変換されます。
逆向き、つまり Psych.dump で Ruby のオブジェクトを YAML ドキュメントに変換するときには、中間的な AST に変換してからそれを YAML ドキュメントに変換します。
YAML AST の各ノードのクラスはすべて Psych::Nodes の下にあります。 AST を手作業で構築して、visitor を使って AST を YAML ドキュメントや Ruby のオブジェクトに変換したりすることができます。
以下の例ではスカラを1つ持つリストの AST を構築しています。
# Create our nodes stream = Psych::Nodes::Stream.new doc = Psych::Nodes::Document.new seq = Psych::Nodes::Sequence.new scalar = Psych::Nodes::Scalar.new('foo') # Build up our tree stream.children << doc doc.children << seq seq.children << scalar
stream は AST のルートです。以下のようにして AST を YAML ドキュメントに変換できます。
stream.to_yaml => "---\n- foo\n"
Ruby のオブジェクトに変換するためには以下のようにします。
stream.to_ruby => [["foo"]]
YAML AST 仕様
正しい YAML AST は Psych::Nodes::Stream ノードが木のルートでなければなりません。Psych::Nodes::Stream ノードは 1つ以上の Psych::Nodes::Document ノードを子として持っていなければなりません。
Psych::Nodes::Document は子ノードをちょうど1個持っていなければなりません。子ノードは以下のいずれかでなければなりません。
Psych::Nodes::Sequence と Psych::Nodes::Mapping は複数の子ノードを持つことができます。Psych::Nodes::Mapping の子ノード数は偶数でなければなりません。
Psych::Nodes::Sequence と Psych::Nodes::Mapping の子ノードとして有効なものは以下のいずれかです。
Psych::Nodes::Scalar と Psych::Nodes::Alias は子ノードを持つことができません。