模块 Psych::Nodes

概述

当使用 Psych.load 反序列化 YAML 文档时,文档会被转换为中间 AST。然后,该中间 AST 会被转换为 Ruby 对象图。

反之,当使用 Psych.dump 时,Ruby 对象图会被转换为中间 AST,然后被转换为 YAML 文档。

Psych::Nodes 包含构成 YAML AST 节点的所有类。您可以手动构建 AST 并使用其中一个访问者(参见 Psych::Visitors)将该 AST 转换为 YAML 文档或 Ruby 对象图。

以下是一个构建表示包含一个标量的列表的 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

流是树的根。然后,我们可以将树转换为 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 节点必须有一个且**仅**有一个子节点。该子节点可以是以下之一:

Psych::Nodes::SequencePsych::Nodes::Mapping 节点可以有多个子节点,但 Psych::Nodes::Mapping 节点的子节点数量应为偶数。

所有这些都是 Psych::Nodes::SequencePsych::Nodes::Mapping 节点的有效子节点

Psych::Nodes::ScalarPsych::Nodes::Alias 都是终端节点,不应有任何子节点。