YAML 冒险游戏

作为使用 YAML 的最后一个示例,我为冒险游戏(gamesave_y.rb)提供了一个基本框架。这会创建一些 Treasure 对象和一些 Room 对象。Treasure 对象被放入 Room 对象中(也就是说,它们被放置在 Rooms 包含的数组中),然后 Room 对象被放入 Map 对象中。这具有构造中等复杂数据结构的效果,其中一种类型的对象(Map)包含任意数量的另一种类型的对象(Rooms),每个 Room 对象可以包含零个或多个其它类型的对象(Treasures))。

乍一看,找到一种将混合对象类型的整个网络存储到磁盘并在稍后重建该网络的方法可能看起来像编程噩梦。

事实上,由于 Ruby 的 YAML 库提供的序列化功能,保存和恢复这些数据几乎没有更容易的了。这是因为序列化(serialization)减轻了你逐个保存每个对象的繁琐工作。相反,你只需要“转储”(dump)顶级对象 - 这里就是 Map 对象 mymap

完成此操作后,将自动为你保存顶级对象“包含”的任何对象(如 Rooms)或被包含对象本身包含的对象(如 Treasures)。然后可以通过在单个操作中加载所有已保存的数据并将其分配给“顶级”对象(此处为 map)来重建它们:

gamesave_y.rb
  1. # Save mymap
  2. File.open( 'game.yml', 'w' ){ |f|
  3. YAML.dump( mymap, f )
  4. }
  5. # Reload mymap
  6. File.open( 'game.yml' ){ |f|
  7. mymap = YAML.load(f)
  8. }