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すると、以前にプッシュされた配列内の要素の値が変更されます。as2 回押した後、a[:b]から に変更し2たところ3、すべての要素に変更が反映されました。これについての提案をお願いします。

4

2 に答える 2

5

追加するたびにdupを使用しますs

s << a.dup

このdupメソッドは、ハッシュの浅いコピーを作成します。

アップデート:

浅いコピーが要件を満たさない場合は、マーシャリングを使用します

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

使用する

s << Hash[a]

これによりハッシュがコピーされ、オリジナルを変更できるようになります。

于 2012-10-22T01:16:03.403 に答える