解决方法
一个集合基本上是一个散列,每个键/值对的值设置为相同的值.它是使其表现得像一套的关键.
一旦我们知道,保存和恢复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.