我已经熟悉How can I save an object to a file?了
但是,如果我们必须将多个对象(例如哈希)存储到一个文件中,该怎么办?
我尝试将YAML.dump(hash)追加到代码中不同位置的文件中。但最困难的部分是把它读回来。因为yaml转储可以扩展到许多行,所以我必须解析该文件吗?而且,这只会使代码变得复杂。是否有更好的方法来实现这一点?
PS:同样的问题将在Marshal.dump中持续存在。所以我更喜欢YAML,因为它的可读性更强。
发布于 2014-12-25 19:07:31
YAML.dump创建一个Yaml http://www.yaml.org/spec/1.2/spec.html#id2800132。如果一个文件中有多个Yaml文档,那么就有一个Yaml http://www.yaml.org/spec/1.2/spec.html#id2801681。因此,当您将来自几个对YAML.dump的调用的结果附加到一起时,就会有一个流。
如果您尝试使用YAML.load阅读此文档,您只会得到第一个文档。要获得所有文档,可以使用YAML.load_stream,它将为每个文档提供一个带有条目的数组。
举个例子:
f = File.open('data.yml', 'w')
YAML.dump({:foo => 'bar'}, f)
YAML.dump({:baz => 'qux'}, f)
f.close在此之后,data.yml将如下所示,包含两个单独的文档:
---
:foo: bar
---
:baz: qux现在,您可以这样读回它:
all_docs = YAML.load_stream(File.open('data.yml'))这将为您提供一个类似于[{:foo=>"bar"}, {:baz=>"qux"}]的数组。
如果不想一次将所有文档加载到数组中,可以将一个块传递给load_stream,并在解析后处理每个文档:
YAML.load_stream(File.open('data.yml')) do |doc|
# handle the doc here
end发布于 2014-12-25 11:58:02
您可以通过创建一个分隔符来保存多个对象(可以标记一个对象已经完成,并且可以转到下一个对象)。然后,您可以分两个步骤处理该文件:
现在,这将是有点麻烦,因为有一个更简单的解决方案。假设您有三个哈希要保存:
student = { first_name: "John"}
restaurant = { location: "21 Jump Street" }
order = { main_dish: "Happy Meal" }您可以简单地将它们放入数组中,然后转储它们:
objects = [student, restaurant, order]
dump = YAML.dump(objects)您可以轻松地还原对象:
saved_objects = YAML.load(dump)
saved_student = saved_objects[0]根据您的对象关系,您可能更喜欢使用哈希来保存它们而不是数组(这样您就可以命名它们而不是根据顺序)。
https://stackoverflow.com/questions/27646425
复制相似问题