我已熟悉How can I save an object to a file?
但是如果我们必须将多个对象(比如哈希)存储到文件中呢。
我尝试将YAML.dump(hash)
附加到我代码中不同位置的文件中。但困难的部分是阅读它。由于yaml转储可以扩展到许多行,我是否必须解析文件?这也只会使代码复杂化。有没有更好的方法来实现这一目标?
PS:Marshal.dump
会出现同样的问题。所以我更喜欢YAML
,因为它更具人性化。
答案 0 :(得分:4)
YAML.dump
创建一个Yaml document。如果你在一个文件中有几个Yaml文档,那么你有一个Yaml stream。因此,当您将多次调用的结果附加到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
答案 1 :(得分:1)
您可以通过创建分隔符来管理保存多个对象(标记一个对象已完成并且您转到下一个对象的东西)。然后,您可以分两步处理该文件:
现在,这会有点麻烦,因为有一个更简单的解决方案。我们假设您有三个哈希要保存:
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]
根据您的对象关系,您可能更喜欢使用哈希来保存它们而不是数组(这样您就可以命名它们而不是依赖于顺序)。