如何将任意Ruby对象保存到磁盘并在必要时将其读回?
我想将
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,请查看 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |