一个文件中多个文档

早些时候,我提到过三个破折号用于标记新的 YAML “文档”(document)的开头。在 YAML 术语中,文档是离散的组或片段。单个文件可能包含许多此类“文档”。

例如,假设你要将两个数组 arr1arr2 保存到文件 ‘multidoc.yml’。 这里 arr1 是一个包含两个嵌套数组的数组,arr2 是一个包含两个 CD 对象的数组:

multi_docs.rb
  1. arr1 = [ ["The Groovesters", "Groovy Tunes", 12 ],
  2. [ "Dolly Parton", "Greatest Hits", 38 ]
  3. ]
  4. arr2 = [ CD.new("Gribbit Mcluskey", "Fab Songs", 22),
  5. CD.new("Wayne Snodgrass", "Singalong-a-Snodgrass", 24)
  6. ]

这是我将这些数组转储到 YAML 并将它们写入文件的例程(如第 13 章所述,'w' 参数导致文件以写入模式被打开):

  1. File.open( 'multidoc.yml', 'w' ){ |f|
  2. YAML.dump( arr1, f )
  3. YAML.dump( arr2, f )
  4. }

查看文件 ‘multidoc.yml’,你将看到数据已保存为两个单独的’文档’ - 每个文档以三个破折号开头:

  1. ---
  2. - - The Groovesters
  3. - Groovy Tunes
  4. - 12
  5. - - Dolly Parton
  6. - Greatest Hits
  7. - 38
  8. ---
  9. - !ruby/object:CD
  10. artist: Gribbit Mcluskey
  11. name: Fab Songs
  12. numtracks: 22
  13. - !ruby/object:CD
  14. artist: Wayne Snodgrass
  15. name: Singalong-a-Snodgrass
  16. numtracks: 24

现在,我需要找到一种通过将数据作为两个文档读取来重建这些数组的方法。load_documents 方法提供了该解决方式。

load_documents 方法调用一个块并将每个连续文档传递给它。下面是一个如何使用此方法从两个 YAML 文档重建两个数组(放在另一个数组 $new_arr 中)的示例:

  1. File.open( 'multidoc.yml' ) {|f|
  2. YAML.load_documents( f ) { |doc|
  3. $new_arr << doc
  4. }
  5. }

你可以通过执行以下操作来验证是否已使用两个数组初始化 $new_arr

  1. puts( "$new_arr contains #{$new_arr.size} elements" )
  2. p( $new_arr[0] )
  3. p( $new_arr[1] )

或者,这是一种更通用的做同样事情的方法,它适用于任何长度的数组:

  1. $new_arr.each{ |arr| p( arr ) }