Пользовательский класс Ruby для и из YAML; - PullRequest
3 голосов
/ 08 июня 2010

У меня проблемы с десериализацией класса ruby, который я написал в YAML.

Где я хочу быть

Я хочу иметь возможность передать один объект как полный «вопрос», который включает в себя текст вопроса, несколько возможных ответов (для множественного выбора) и правильный ответ. Один модуль (кодировщик) принимает входные данные, создает из него класс «вопрос» и добавляет его в пул вопросов. Другой модуль читает пул вопросов и создает массив объектов «вопрос».

Где я сейчас нахожусь

Образец пула вопросов

--- |
 --- !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? Я уже просмотрел YAML Rdoc, и я не очень много поглощал, поэтому, пожалуйста, не просто связывайте меня с ним.
  2. Какие еще методы вы бы предложили использовать? Есть ли лучший способ хранить такие вопросы? Должен ли я использовать документ DB, реляционный DB, XML? Какой-то другой формат?

1 Ответ

3 голосов
/ 08 июня 2010

Когда вы пишете в yaml, вам не нужно сначала вызывать to_yaml, просто передайте сам объект в YAML.dump (object)

Это, вероятно, привело вас к другим проблемам, потому что вывод to_yaml был строкой ... и YAML.dump фактически записал ваш объект как строку в файл (поэтому у вас есть начальная строка "- |". Любой код, загружающий этот файл, загрузит эти данные в виде строки.

Загрузите один объект, подобный этому:

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

«new», которое вы используете, обычно сбивает с толку, потому что new - это ключевое слово.

...