加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 04:30:28 所属栏目:百科 来源:网络整理
导读:我想将 Ruby集或散列保存到磁盘,并在必要时从文件中返回.我怎样才能做到这一点? 解决方法 一个集合基本上是一个散列,每个键/值对的值设置为相同的值.它是使其表现得像一套的关键. 一旦我们知道,保存和恢复Set就像保存数组或哈希一样,并且可以通过多种方式完
我想将 Ruby集或散列保存到磁盘,并在必要时从文件中返回.我怎样才能做到这一点?

解决方法

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

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

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

由于Set是Hash的变体,因此您还可以使用YAML或JSON来序列化数据.两者的最大优点是它们很容易在其他语言中重用. 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.write和File.read,两者都是从IO继承的,如果您决定使用YAML,请查看YAML.load_file,which is inherited from Psych.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读