ruby - 如何将任意 Ruby 对象保存到磁盘并在必要时读回?

标签 ruby file object save disk

<分区>

我想将 Ruby 集或哈希保存到磁盘,并在必要时从文件中取回。我该怎么做?

最佳答案

集合基本上是一个散列,每个键/值对的值设置为相同的值。这是使其表现得像一个集合的关键。

一旦我们知道,保存和恢复 Set 就像保存数组或散列一样,并且可以通过多种方式完成。

@steenslag 提到使用 Marshall.dump,这很好。

因为Set是Hash的变体,你也可以使用YAMLJSON序列化数据。两者的最大优点是它们很容易在其他语言中重用。 YAML 和 JSON 通常用于在主机之间存储和传输数据,并且是非常易读的格式。

这里有一些例子可以给你一些想法:

require 'set'
require 'json'
require 'yaml'

foo = Set.new
foo << 1
foo << 2
foo << 1
foo # => #<Set: {1, 2}>

foo 是一个集合。它也可以转换为数组:

foo.to_a # => [1, 2]

我们可以使用 YAML 序列化 Set:

puts YAML.dump(foo)
# >> --- !ruby/object:Set
# >> hash:
# >>   1: true
# >>   2: true

并且,我们可以创建序列化版本,然后再次将其解析回一个集合:

YAML.load(YAML.dump(foo)) # => #<Set: {1, 2}>

因为foo是一个Set,我们也可以把它转成一个Array,然后用YAML序列化:

puts YAML.dump(foo.to_a)
# >> ---
# >> - 1
# >> - 2  

然后我们可以读回数据,并且,如果我们选择,将其转换回一个集合:

bar = YAML.load(YAML.dump(foo.to_a)).to_set
bar.class # => Set
bar # => #<Set: {1, 2}>

或者,如果是读取 YAML 的语言,不支持 Set,比如 Perl,当 Perl 代码读取和解析数据时,它可以保留为 Array。

JSON 的工作原理类似。下面是通过数组往返数据的示例:

foo.to_a.to_json # => "[1,2]"
JSON.parse(foo.to_a.to_json) # => [1, 2]
JSON.parse(foo.to_a.to_json).to_set # => #<Set: {1, 2}>

JSON还有[]方法,这个方法很聪明,可以判断传入的参数是String还是Array或Hash。如果它是第一个参数,则参数将被解析并作为 Ruby 对象返回。如果是后两者,则序列化为字符串:

JSON[foo.to_a] # => "[1,2]"
JSON[JSON[foo.to_a]] # => [1, 2]
JSON[JSON[foo.to_a]].to_set # => #<Set: {1, 2}>

无论是使用 JSON 还是 YAML,读取和写入结果字符串都可以使用几种不同的 IO 或 File 方法轻松完成。看File.writeFile.read , 都继承自 IO,如果您决定使用 YAML,请查看 YAML.load_file, which is inherited from Psych .

关于ruby - 如何将任意 Ruby 对象保存到磁盘并在必要时读回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20024067/

相关文章:

ruby-on-rails - 来自 group(..).sum(..) 的 Rails 排序结果

android - 用户无法删除的永久数据

ruby-on-rails - Heroku + 公寓:Apartment::FileNotFound:/app/db/schema.rb 尚不存在

ruby - 如何获取 ruby​​ 中的时区列表?

python - 我的 Python 脚本中的奇怪输出 - [0m 或 [32m

c# - 定义特定类型的列表(不是对象)

ios - 核心数据发送和接收对象

java - 从大型 XML 文件创建 JAXB 对象

ruby - 使用 Mongoid,我可以 "update_all"一次将一个值推送到多个条目的数组字段吗?

android - 将收据打印到文件