修改多次出现的哈希

时间:2012-10-22 01:10:31

标签: ruby hash mutable

a是一个哈希值。 s是一个数组,我想迭代地推送哈希a。我们的想法是独立地保留每个迭代推送的哈希值。这是我试过的。

a = {:a=> 1, :b=>2}

s = []
s << a
s << a     # => [{:b=>2, :a=>1}, {:b=>2, :a=>1}]
a[:b] = 3
s          # => [{:b=>3, :a=>1}, {:b=>3, :a=>1}]

t = []
t.push(a)    # => [{:b=>3, :a=>1}]
t.push(a)    # => [{:b=>3, :a=>1}, {:b=>3, :a=>1}]
a[:b] = 4
t            # => [{:b=>4, :a=>1}, {:b=>4, :a=>1}]

上面没有给出解决方案:更改a会更改先前推送的数组内元素的值。将a推送到s两次后,我将a[:b]2更改为3,所有元素都反映了这一变化。请给我这个建议。

2 个答案:

答案 0 :(得分:5)

每次添加s

时都使用dup
s << a.dup

dup方法将创建哈希的浅层副本。

更新

如果浅拷贝不满足要求,则使用Marshaling

s << Marshal.load( Marshal.dump(a) )

答案 1 :(得分:2)

使用

s << Hash[a]

这将复制哈希并允许您更改原始文件。