module Psych::Nodes
概览
当使用 Psych.load 反序列化 YAML 文档时,该文档会被翻译成一个中间 AST。然后,这个中间 AST 会被翻译成一个 Ruby 对象图。
反过来,当使用 Psych.dump 时,Ruby 对象图会被翻译成一个中间 AST,然后这个 AST 会被转换成一个 YAML 文档。
Psych::Nodes 包含了构成 YAML AST 节点的**所有**类。你可以手动构建一个 AST,然后使用其中一个访问者(参见 Psych::Visitors)将该 AST 转换为 YAML 文档或 Ruby 对象图。
下面是一个构建表示包含一个标量(scalar)的列表的 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)是树的根节点。然后我们可以将树转换为 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::Sequence 和 Psych::Nodes::Mapping 节点可以有很多子节点,但 Psych::Nodes::Mapping 节点应该有偶数个子节点。
以上所有都可以是 Psych::Nodes::Sequence 和 Psych::Nodes::Mapping 节点的有效子节点:
Psych::Nodes::Scalar 和 Psych::Nodes::Alias 都是终端节点,不应该有任何子节点。