1

基本的なオブジェクトの永続性 (ゲームの保存、ゲームの読み込み) をサンドボックス アプリに構築しようとしています。

YAML を使用してオブジェクトをファイルにダンプしていますが、それらを復元したいと考えています。インスタンス化されたオブジェクトの 2 つの異なるクラスがあり、それらは次のように記述されますが、すべて問題ないようです。

---
- !ruby/object:Game::Room
    reference: :largecave
    name: Large cave
    description: a large empty cave
    connections:
    :west: :smallcave
    :south: :waterfall
- !ruby/object:Game::Room
    reference: :smallcave
    name: Small cave
    description: a small cave
    connections:
    :east: :largecave
- !ruby/object:Game::Room
    reference: :waterfall
(... etc)
---
- !ruby/object:Game::GameObject
    reference: :key
    name: Key
    description: A small key
    room: :smallcave
- !ruby/object:Game::GameObject
    reference: :bowl
(....etc)

問題は、オブジェクトの 2 つの異なる配列を回復して設定しようとすることです。

YAML.load(datastore.read)

正常に動作しますが、オブジェクトの1つのクラスにのみ適しています。次のようにselectメソッドを試しましたが、成功しませんでした:

@rooms = datastore.select("!ruby/object:Game::Room")
@objects = datastore.select("!ruby/object:Game::GameObject") 
4

1 に答える 1

2

データの使いやすさに関する提案として、オブジェクトのコンテンツのハッシュを生成するクラス用のメソッドをいくつか作成することをお勧めします。そうすれば、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

これは基本的にハッシュであり、placesthingsは埋め込みデータのキーです。

「Adventure」の構成を YAML ファイルに保存すると扱いにくくなる可能性があるため、最終的にはSequelや SQLite データベースなどの使用を検討することをお勧めします。データを一般的な形式で保存することもできますが、高速ランダム アクセス用に設定することもでき、メモリに格納する必要はありません。

于 2012-10-19T16:28:42.233 に答える