深入探索

YAML 的简要指南

在 YAML 中,数据被分成包含“序列”(sequences)数据的“文档”。每个文档以三个短划线字符 --- 开头,列表中的每个单独元素都以单个短划线字符 - 开头。因此,例如,这是一个 YAML 数据文件,包含一个文档和两个列表项:

  1. ---
  2. - artist: The Groovesters
  3. name: Groovy Tunes
  4. numtracks: 12
  5. - artist: Dolly Parton
  6. name: Greatest Hits
  7. numtracks: 38

在上面的示例中,你可以看到每个列表项由两部分组成 - 名称如 artist:(在每个列表项中相同)和右侧的一段数据,例如 Dolly Parton,可能因每个列表项而异。这些项类似于 Ruby 的 Hash 中的键值对。YAML 将键值列表称为“映射”(maps)。

下面是一个包含两个项目的列表的 YAML 文档,每个项目包含三个项目 - 换句话说,它是包含两个三项“嵌套”数组的数组的 YAML 表示形式:

  1. ---
  2. - - The Groovesters
  3. - Groovy Tunes
  4. - 12
  5. - - Dolly Parton
  6. - Greatest Hits
  7. - 38

现在让我们看看 YAML 如何处理嵌套的哈希(Hashes)。

思考这个 Hash:

hash_to_yaml.rb
  1. hsh = { :friend1 => 'mary',
  2. :friend2 => 'sally',
  3. :friend3 => 'gary',
  4. :morefriends => { :chap_i_met_in_a_bar => 'simon',
  5. :girl_next_door => 'wanda'
  6. }
  7. }

正如我们已经看到的,Hash 在 YAML 中很自然地表示为键值对列表。但是,在上面显示的示例中,关键字 :morefriends 与嵌套哈希值相关联。YAML 如何表示?事实证明,与数组一样(参见本章前面的“嵌套序列”),它只是缩进嵌套的哈希:

  1. :friend1: mary
  2. :friend2: sally
  3. :friend3: gary
  4. :morefriends:
  5. :chap_i_met_in_a_bar: simon
  6. :girl_next_door: wanda
有关 YAML 的详细信息,请访问 http://yaml.org

随 Ruby 提供的 YAML 库非常庞大且复杂,并且有许多方法可供你使用,而不仅是本章所述的。但是,你现在应该对 YAML 有了足够的了解,以便在你自己的程序中使用它。你可以在闲暇时慢慢地探索 YAML 库。

但事实证明,YAML 并不是在 Ruby 中序列化数据的唯一方法。我们将在下一章中讨论另一种方式。