首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我们可以将多个对象存储在文件中吗?

我们可以将多个对象存储在文件中吗?
EN

Stack Overflow用户
提问于 2014-12-25 10:35:36
回答 2查看 1.9K关注 0票数 2

我已经熟悉How can I save an object to a file?

但是,如果我们必须将多个对象(例如哈希)存储到一个文件中,该怎么办?

我尝试将YAML.dump(hash)追加到代码中不同位置的文件中。但最困难的部分是把它读回来。因为yaml转储可以扩展到许多行,所以我必须解析该文件吗?而且,这只会使代码变得复杂。是否有更好的方法来实现这一点?

PS:同样的问题将在Marshal.dump中持续存在。所以我更喜欢YAML,因为它的可读性更强。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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,它将为每个文档提供一个带有条目的数组。

举个例子:

代码语言:javascript
复制
f = File.open('data.yml', 'w')

YAML.dump({:foo => 'bar'}, f)

YAML.dump({:baz => 'qux'}, f)

f.close

在此之后,data.yml将如下所示,包含两个单独的文档:

代码语言:javascript
复制
---
:foo: bar
---
:baz: qux

现在,您可以这样读回它:

代码语言:javascript
复制
all_docs = YAML.load_stream(File.open('data.yml'))

这将为您提供一个类似于[{:foo=>"bar"}, {:baz=>"qux"}]的数组。

如果不想一次将所有文档加载到数组中,可以将一个块传递给load_stream,并在解析后处理每个文档:

代码语言:javascript
复制
YAML.load_stream(File.open('data.yml')) do |doc|
  # handle the doc here
end
票数 4
EN

Stack Overflow用户

发布于 2014-12-25 11:58:02

您可以通过创建一个分隔符来保存多个对象(可以标记一个对象已经完成,并且可以转到下一个对象)。然后,您可以分两个步骤处理该文件:

  • 读取该文件,将其拆分为每个分隔符
  • 使用YAML从每个块恢复散列

现在,这将是有点麻烦,因为有一个更简单的解决方案。假设您有三个哈希要保存:

代码语言:javascript
复制
student = { first_name: "John"}
restaurant = { location: "21 Jump Street" }
order = { main_dish: "Happy Meal" }

您可以简单地将它们放入数组中,然后转储它们:

代码语言:javascript
复制
objects = [student, restaurant, order]
dump = YAML.dump(objects)

您可以轻松地还原对象:

代码语言:javascript
复制
saved_objects = YAML.load(dump)
saved_student = saved_objects[0]

根据您的对象关系,您可能更喜欢使用哈希来保存它们而不是数组(这样您就可以命名它们而不是根据顺序)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27646425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档