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

我想将 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

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

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

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

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

然后我们可以重新读取数据,如果我们选择,则将其转换回Set:

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

或者,如果它是一种正在读取YAML的语言,它不支持Set,就像Perl一样,它可以在Perl代码读取和解析数据时保留为数组.

JSON的工作原理类似.以下是通过Array往返数据的示例:

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.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...