如何用YAML更新已经实例化的Ruby对象?

如何用YAML更新已经实例化的Ruby对象?,ruby,yaml,Ruby,Yaml,基本上,我已经有了一个Ruby对象的实例,但我想从yaml中更新任何实例变量。有一个to_yaml函数将我的对象转储到yaml。我在找相反的东西。例如,my_obj.from_yaml(yaml_stuff),并让它从传入的yaml更新实例变量 我是否需要在from_yaml函数中使用yaml::load并复制每个实例变量?如果是这样的话,我是否可以使用一个函数来快速复制这些变量而无需太多键入 Ruby的yaml库是否已经有了一些东西,我可以将对象和yaml传递给它,然后它就可以做我想要它做的事

基本上,我已经有了一个Ruby对象的实例,但我想从yaml中更新任何实例变量。有一个to_yaml函数将我的对象转储到yaml。我在找相反的东西。例如,my_obj.from_yaml(yaml_stuff),并让它从传入的yaml更新实例变量

我是否需要在from_yaml函数中使用yaml::load并复制每个实例变量?如果是这样的话,我是否可以使用一个函数来快速复制这些变量而无需太多键入

Ruby的yaml库是否已经有了一些东西,我可以将对象和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

据我所知,YAML库本身没有这样的功能;它主要用于转储和读取数据,而不是在内存和磁盘中保持数据的最新状态。如果您计划以最小的麻烦保持内存和磁盘中的数据彼此同步,您是否考虑过像或这样的数据持久性库

如果您仍然热衷于使用YAML库,并且假设没有太多不同的类可以持久化,那么只需编写一个小的“updater”方法,在给定类似对象的情况下更新该类的对象可能是有意义的。或者,您可以重新编写应用程序,以确保只需从YAML重新加载所有对象,而无需更新它们(即,转储旧对象并创建新对象)


另一种选择是使用元编程读取对象的属性并相应地更新它们,但这似乎容易出错,而且很危险。

您的问题还不够清楚。你说的是哪门课?什么类型的YAML文档?您不能将所有内容序列化到YAML或从YAML序列化

让我们假设您的对象只有一组简单、YAML兼容类型的实例变量,例如字符串、数字和符号

在这种情况下,您通常可以从_yaml方法写入
,该方法将yaml文件加载到
键->值
对的散列中,对其进行迭代,并使用
更新名为
的每个实例变量。这看起来有用吗?如果有用,你需要帮助写这样的方法吗

编辑:


您无需将对象状态保存在散列中-您仍然可以使用IVAR和attr\U访问器-只需打开一个新模块(例如
YamlUpdateable
),实现一个from\u yaml方法,该方法将根据从yaml反序列化的散列更新IVAR,并将模块包含在要从YAML反序列化的任何类中。

您要查找的是
merge
命令

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

// merge variables
my_obj.merge(yml)

对不起,我不清楚。对象成员由非常简单的YAML兼容类型组成。我不知道ruby的yaml库中是否已经存在这个功能,或者我是否需要做一些特殊的事情。听起来我需要做些特别的事情。我可能需要将此作为另一个问题发布,但将实例数据存储在散列中并使用方法_missing更新数据是否有好处?然后我就可以随意输入和输出散列了。看起来对象类上没有合并函数。不过哈希类有一个。