转换成 YAML

YAML 定义了一种序列化(数据保存)格式,它将信息存储为人类可读的文本。YAML 可以与各种编程语言一起使用,为了在 Ruby 中使用它,你的代码需要使用 yaml.rb 文件。通常,这可以通过在代码单元的顶部加载或“引入”(requiring)文件来完成,如下所示:

  1. require 'yaml'

完成此操作后,你将可以访问各种方法将 Ruby 对象转换为 YAML 格式,以便将其数据写入文件。随后,你将能够回读已保存的数据并使用它来重新构造 Ruby 对象。

要将对象转换为 YAML 格式,可以使用 to_yaml 方法。它可以转换任何对象 - 字符串,整数,数组,哈希等。例如,这是转换字符串的方式:

to_yaml1.rb
  1. "hello world".to_yaml

这是如何转换数组:

  1. ["a1", "a2" ].to_yaml

这是你通过此数组转换获得的 YAML 格式:

  1. ---
  2. - a1
  3. - a2

请注意定义新 YAML ‘文档’的开头的三个破折号以及定义列表中每个新元素的单个破折号。有关 YAML 格式的更多信息,请参阅本章末尾的“深入探索”部分。

你还可以将非标准类型的对象转换为 YAML。例如,假设你创建了此类和对象…

to_yaml2.rb
  1. class MyClass
  2. def initialize( anInt, aString )
  3. @myint = anInt
  4. @mystring =aString
  5. end
  6. end
  7. ob1 = MyClass.new( 100, "hello world" ).to_yaml

此对象的 YAML 表示形式将以文本 !ruby/object: 开头,后跟类名,每行一个变量名称附加冒号(但减去 @)及其值:

  1. --- !ruby/object:MyClass
  2. myint: 100
  3. mystring: hello world

如果要打印出对象的 YAML 表示,可以使用方法 y(),它是一种 YAML 的方法,等同于我们熟知的用来查看并打印正常的 Ruby 对象的 p() 方法:

yaml_test1.rb
  1. y( ['Bert', 'Fred', 'Mary'] )

这将显示:

  1. ---
  2. - Bert
  3. - Fred
  4. - Mary

你可以同样的显示一个哈希对象…

  1. y( { 'fruit' => 'banana', :vegetable => 'cabbage', 'number' => 3 } )

…在这种情况下,每个键/值对都放在一个新行上:

  1. ---
  2. number: 3
  3. fruit: banana
  4. :vegetable: cabbage

或者你可以显示自己的“自定义”对象…

  1. t = Treasure.new( 'magic lamp', 500 )
  2. y( t )

…它显示的数据,如前面我使用 to_yaml 的示例一样,顶部是类名以及连续行上是一对变量名和值:

  1. --- !ruby/object:Treasure
  2. name: magic lamp
  3. value: 500
yaml_test2.rb

你甚至可以使用 y() 来显示非常复杂的对象,例如嵌套数组:

  1. arr1 = [ ["The Groovesters", "Groovy Tunes", 12 ],
  2. [ "Dolly Parton", "Greatest Hits", 38 ]
  3. ]
  4. y( arr1 )

…或包含任意类型对象的数组:

  1. arr2 = [ CD.new("The Beasts", "Beastly Tunes", 22),
  2. CD.new("The Strolling Bones", "Songs For Senior Citizens", 38)
  3. ]
  4. y( arr2 )