修改多次出现的哈希

Sau*_*eet 0 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}]
Run Code Online (Sandbox Code Playgroud)

上面没有给出解决方案:更改a更改先前推送的数组内元素中的值.推后as两次,我改变了a[:b]23,所有的元素体现了变化.请给我这个建议.

meg*_*gas 5

每次添加时都使用dups

s << a.dup
Run Code Online (Sandbox Code Playgroud)

dup方法将创建哈希的浅表副本.

更新:

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

s << Marshal.load( Marshal.dump(a) )
Run Code Online (Sandbox Code Playgroud)