<分区>
我想将 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
并且,我们可以创建序列化版本,然后再次将其解析回一个集合:
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.write和 File.read , 都继承自 IO,如果您决定使用 YAML,请查看 YAML.load_file
, which is inherited from Psych .
关于ruby - 如何将任意 Ruby 对象保存到磁盘并在必要时读回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20024067/