模块 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
节点必须有一个或多个 Psych::Nodes::Document
节点作为子节点。
Psych::Nodes::Document
节点必须有且仅有一个子节点。该子节点可以是下列之一:
Psych::Nodes::Sequence
和 Psych::Nodes::Mapping
节点可以有多个子节点,但 Psych::Nodes::Mapping
节点应该有偶数个子节点。
以下所有节点都是 Psych::Nodes::Sequence
和 Psych::Nodes::Mapping
节点的有效子节点:
Psych::Nodes::Scalar
和 Psych::Nodes::Alias
都是终端节点,不应该有任何子节点。