データの使いやすさに関する提案として、オブジェクトのコンテンツのハッシュを生成するクラス用のメソッドをいくつか作成することをお勧めします。そうすれば、Ruby でのみ使用でき、他の言語では使用できない Ruby オブジェクトではなく、ユニバーサルなハッシュの YAML 表現を格納できます。
YAML ファイルに複数のドキュメントを作成するのはやめて、次のようなものを使用します。
require 'pp'
require 'yaml'
places = [
{
reference: :largecave,
name: 'Large cave',
description: 'a large empty cave',
connections: {
west: :smallcave,
south: :waterfall
}
},
{
reference: :smallcave,
name: 'Small cave',
description: 'a small cave',
connections: {
east: :largecave
}
},
{
reference: :waterfall
}
]
things = [
{
reference: :key,
name: 'Key',
description: 'A small key',
room: :smallcave
},
{
reference: :bowl
}
]
data = [
places,
things
]
puts data.to_yaml
どの出力:
---
- - :reference: :largecave
:name: Large cave
:description: a large empty cave
:connections:
:west: :smallcave
:south: :waterfall
- :reference: :smallcave
:name: Small cave
:description: a small cave
:connections:
:east: :largecave
- :reference: :waterfall
- - :reference: :key
:name: Key
:description: A small key
:room: :smallcave
- :reference: :bowl
YAML ランドを往復した後のデータを見ると、次のようになります。
places, things = YAML.load(data.to_yaml)
=> [[{:reference=>:largecave,
:name=>"Large cave",
:description=>"a large empty cave",
:connections=>{:west=>:smallcave, :south=>:waterfall}},
{:reference=>:smallcave,
:name=>"Small cave",
:description=>"a small cave",
:connections=>{:east=>:largecave}},
{:reference=>:waterfall}],
[{:reference=>:key,
:name=>"Key",
:description=>"A small key",
:room=>:smallcave},
{:reference=>:bowl}]]
pp places
[{:reference=>:largecave,
:name=>"Large cave",
:description=>"a large empty cave",
:connections=>{:west=>:smallcave, :south=>:waterfall}},
{:reference=>:smallcave,
:name=>"Small cave",
:description=>"a small cave",
:connections=>{:east=>:largecave}},
{:reference=>:waterfall}]
pp things
[{:reference=>:key,
:name=>"Key",
:description=>"A small key",
:room=>:smallcave},
{:reference=>:bowl}]
YAML::Storeを利用して、次のようにすることもできます。
require 'yaml/store'
require 'pp'
store = YAML::Store.new('objects.store')
store.transaction do
store['places'] = places
store['things'] = things
end
places = things = nil
store.transaction(true) do
places = store['places']
things = store['things']
end
pp places
pp things
次のようになります。
[{:reference=>:largecave,
:name=>"Large cave",
:description=>"a large empty cave",
:connections=>{:west=>:smallcave, :south=>:waterfall}},
{:reference=>:smallcave,
:name=>"Small cave",
:description=>"a small cave",
:connections=>{:east=>:largecave}},
{:reference=>:waterfall}]
[{:reference=>:key,
:name=>"Key",
:description=>"A small key",
:room=>:smallcave},
{:reference=>:bowl}]
YAML::Store はディスク上に YAML ファイルを作成します:
---
places:
- :reference: :largecave
:name: Large cave
:description: a large empty cave
:connections:
:west: :smallcave
:south: :waterfall
- :reference: :smallcave
:name: Small cave
:description: a small cave
:connections:
:east: :largecave
- :reference: :waterfall
things:
- :reference: :key
:name: Key
:description: A small key
:room: :smallcave
- :reference: :bowl
これは基本的にハッシュであり、places
とthings
は埋め込みデータのキーです。
「Adventure」の構成を YAML ファイルに保存すると扱いにくくなる可能性があるため、最終的にはSequelや SQLite データベースなどの使用を検討することをお勧めします。データを一般的な形式で保存することもできますが、高速ランダム アクセス用に設定することもでき、メモリに格納する必要はありません。