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
,所有元素都反映了这一变化。请给我这个建议。
答案 0 :(得分:5)
每次添加s
s << a.dup
dup
方法将创建哈希的浅层副本。
更新
如果浅拷贝不满足要求,则使用Marshaling
s << Marshal.load( Marshal.dump(a) )
答案 1 :(得分:2)
使用
s << Hash[a]
这将复制哈希并允许您更改原始文件。