3

YAMLに書き込んだrubyクラスの逆シリアル化に問題があります。

なりたいところ

1つのオブジェクトを、質問テキスト、いくつかの可能な回答(複数選択の場合)、および正解を含む完全な「質問」として渡すことができるようにしたいと思います。1つのモジュール(エンコーダー)が入力を受け取り、そこから「質問」クラスを作成して、質問プールに追加します。別のモジュールが質問プールを読み取り、「質問」オブジェクトの配列を作成します。

私が現在いる場所

サンプル質問プール

--- |
 --- !ruby/object:MultiQ 
 a: "no"
 answer: "no"
 b: "no"
 c: "no"
 d: "no"
 text: "yes?"

YAMLファイルへのエンコーダーダンプ。オブジェクトは、入力で満たされたMultiQです。(下記参照。)

def dump(file, object)
  File.open(file, 'a') do |out|
    YAML.dump(object.to_yaml, out)
  end
  object = nil
end

MultiQクラスの定義

class MultiQ
  attr_accessor :text, :answer, :a, :b, :c, :d

  def initialize(text, answer, a, b, c, d)
    @text = text
    @answer = answer
    @a = a
    @b = b
    @c = c
    @d = d
  end
end

デコーダー(私はさまざまなことを試みてきたので、ここにあるのは私の最初または最良の推測ではありませんでした。しかし、私は途方に暮れていて、ドキュメントは実際に物事を十分に完全に説明していません。)

  File.open( "test_set.yaml" ) do |yf|
    YAML.load_documents( yf ) { |item|
      new = YAML.object_maker( MultiQ, item)
      puts new
    }
  end

あなたが答えることができる質問

  1. どうすれば目標を達成できますか?Rubyクラスを正常に逆シリアル化するには、ファイルまたはドキュメントの解析、読み込みの間にどのメソッドを使用する必要がありますか?私はすでにYAMLRdocを調べましたが、あまり吸収していなかったので、リンクするだけではいけません。
  2. 他にどのような方法を使用することをお勧めしますか?このような質問を保存するためのより良い方法はありますか?ドキュメントデータベース、リレーショナルデータベース、xmlを使用する必要がありますか?他のフォーマット?
4

1 に答える 1

3

yamlに書き込む場合、最初にto_yamlを呼び出す必要はなく、オブジェクト自体をYAML.dump(object)に渡すだけです。

to_yamlの出力が文字列であり、YAML.dumpが実際にオブジェクトを文字列としてファイルに書き込んだため、これにより他の問題が発生した可能性があります(そのため、最初の「-|」行があります。コードの読み込みはすべてそのファイルはそのデータを文字列としてロードします。

次のような単一のオブジェクトをロードします。

File.open( 'test_set.yaml', 'r') { |fh|  mq_loaded = YAML.load( fh ) }

newはキーワードであるため、使用している「new」は一般的に混乱を招きます。

于 2010-06-08T02:04:36.623 に答える