1

dup浅いコピーなので、これを行うとき:

h = {one: {a:'a', b: 'b'}}
h_copy = h.dup
h_copy[:one][:b] = 'new b'

hh_copy同じです:{:one=>{:a=>"a", :b=>"new b"}} はい、その通りです。

しかしh、1次元ハッシュはいつですか。

h = {a:'a', b: 'b'}
h_copy = h.dup
h_copy[:b] = 'new b'
h still is: {a:'a', b: 'b'}
h_copy is {a:'a', b: 'new b'}

なんで?

4

3 に答える 3

3

2 次元ハッシュは、別のハッシュ コンテナーを含むある種のコンテナーと考え​​ることができます。したがって、2 つのコンテナーがあります。

duponを呼び出すとhdup最も外側のコンテナーのコピーが返されますが、内側のコンテナーはコピーされないため、これが浅いコピーの動作です。dup の後、3 つのコンテナができました:h_copyは新しい 3 番目のコンテナです。このキーはの内部コンテナ:oneを指すだけです。h

于 2012-11-19T08:10:00.863 に答える
0

あなたが言ったように、dup浅いコピーです。

h_copyとの両方hが同じオブジェクトを参照する必要があるようです。

次に、単純に実行しますh_copy = h(つまり、いいえdup)。

h = {a:'a', b: 'b'}
h_copy = h.dup
h_copy[:b] = 'new b'
h #=> {a:'a', b: 'new b'}
于 2012-11-19T06:36:40.267 に答える
-1

したがって、1時間のブレーンストーミングの後、多次元ハッシュでは、dupが各キーに対して同じobject_idを生成し、それがハッシュを参照しているのに対し、一次元ハッシュでは、object_idは最初は類似しているという結論に達しました。ただし、オブジェクトに変更を加えると、Rubyは新しいobject_idをハッシュキーに割り当てます。

次のコードを見てください

h = { :a => "a", :b => "b" } # => {:a=>"a", :b=>"b"} 
h_clone = h.dup #=> {:a=>"a", :b=>"b"} 
h.object_id #=> 73436330 
h_clone.object_id #=> 73295920 
h[:a].object_id #=> 73436400 
h_clone[:a].object_id #=> 73436400 
h[:b].object_id #=> 73436380 
h_clone[:b].object_id #=> 73436380 
h_clone[:b] = "New B" #=> "New B" 
h_clone[:b].object_id #=> 74385280 
h.object_id #=> 73436330 
h_clone.object_id #=> 73295920 
h[:a].object_id #=> 73436400 
h_clone[:a].object_id #=> 73436400

多次元配列については、次のコードを参照してください

h = { :one => { :a => "a", :b => "b" } } #=> {:one=>{:a=>"a", :b=>"b"}} 
h_copy = h.dup #=> {:one=>{:a=>"a", :b=>"b"}} 
h_copy.object_id #=> 80410620 
h.object_id #=> 80552610 
h[:one].object_id #=> 80552620 
h_copy[:one].object_id #=> 80552620 
h[:one][:a].object_id #=> 80552740 
h_copy[:one][:a].object_id #=> 80552740 
h[:one][:b].object_id #=> 80552700 
h_copy[:one][:b].object_id #=> 80552700 
h_copy[:one][:b] = "New B" #=> "New B" 
h_copy #=> {:one=>{:a=>"a", :b=>"New B"}} 
h #=> {:one=>{:a=>"a", :b=>"New B"}} 
h.object_id #=> 80552610 
h_copy.object_id #=> 80410620 
h[:one].object_id #=> 80552620 
h_copy[:one].object_id #=> 80552620 
h[:one][:b].object_id #=> 81558770 
h_copy[:one][:b].object_id #=> 81558770
于 2012-11-19T08:23:10.080 に答える