Как я могу обновить уже созданный экземпляр объекта Ruby с помощью YAML? - PullRequest
2 голосов
/ 10 ноября 2010

По сути, у меня уже есть экземпляр объекта Ruby, но я хочу обновить все переменные экземпляра, которые я могу, из yaml. Есть функция to_yaml, которая будет выгружать мой объект в yaml. Я ищу что-то наоборот. Например, my_obj.from_yaml (yaml_stuff) и он обновляет переменные экземпляра из переданной yaml.

Нужно ли мне в моей функции from_yaml использовать YAML :: load и копировать каждую переменную экземпляра? Есть ли функция, которую я могу использовать, чтобы быстро скопировать эти переменные без особого ввода, если это так?

Есть ли в библиотеке yaml Ruby что-то, где я могу передать ей объект и yaml, и она просто сделает то, что я хочу?

Редактирование для наглядности

Это простой объект, который будет хранить и загружать очень простые типы, совместимые с yaml, такие как строки и целые числа.

Что я в итоге сделал

Хотя я и ответил на этот вопрос, я хотел добавить то, что в итоге делал, мой патч для Обезьяны объекта

class Object

  def from_yaml(yml)

    if (yml.nil?)
      return
    end

    yml.instance_variables.each do |iv|
      if (self.instance_variable_defined?(iv))
        self.instance_variable_set(iv, yml.instance_variable_get(iv))
      end
    end

  end
end

Ответы [ 3 ]

1 голос
/ 10 ноября 2010

Ваш вопрос недостаточно ясен.О каком классе вы говорите?Что за документы YAML?Вы не можете иметь все , сериализованные в и из YAML.

Давайте предположим, что ваш объект просто имеет набор переменных экземпляра простых, совместимых с YAML типов, таких как строки, числа исимволы.

В этом случае, как правило, вы можете написать метод from_yaml, который бы загружал файл YAML в хеш из key->value пар, выполнял итерацию по нему и обновлял каждую переменную экземпляра с именем key с помощью value.Это кажется полезным, и если да, то нужна ли вам помощь в написании такого метода?

Редактировать:

Вам не нужно сохранять состояние объекта в хэше - вы все еще можетеиспользуйте ivars и attr_accessors - просто откройте новый модуль (скажем, YamlUpdateable), внедрите метод from_yaml, который обновит ваши ivars из десериализованного из YAML хэша, и включите модуль в любой класс, который вы хотите десериализовать из YAML.

1 голос
/ 10 ноября 2010

Насколько я знаю, ничего подобного нет в самой библиотеке YAML; Он в основном предназначен для сброса и чтения данных, а не для их обновления в памяти и на диске. Если вы планируете синхронизировать данные в памяти и на диске с минимальными трудностями, рассматривали ли вы постоянную библиотеку данных, например ActiveRecord или Stone ?

Если вы по-прежнему заинтересованы в использовании библиотеки YAML и предполагаете, что у вас нет много разных классов для сохранения, возможно, имеет смысл просто написать небольшой метод "Updater", который обновляет объект этого класса с учетом похожий объект. Или вы можете переделать ваше приложение, чтобы убедиться, что вы можете просто перезагрузить все объекты из YAML без необходимости их обновления (то есть, сбросить старые объекты и создать новые).

Другой вариант - использовать метапрограммирование, чтобы считывать свойства объекта и обновлять их соответствующим образом, но это кажется подверженным ошибкам и опасным.

0 голосов
/ 11 ноября 2010

То, что вы ищете, это команда merge.

// fetch yaml file
yml = YAML.load_file("path/to/file.yml")

// merge variables
my_obj.merge(yml)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...