0

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会更改先前推送的数组内元素中的值。推as两次后,我a[:b]2变为3,所有元素都反映了变化。请对此提出建议。

4

2 回答 2

5

每次添加时使用dups

s << a.dup

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

更新:

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

s << Marshal.load( Marshal.dump(a) )
于 2012-10-22T01:17:44.140 回答
2

采用

s << Hash[a]

这将复制哈希并允许您更改原始内容。

于 2012-10-22T01:16:03.403 回答