私のようなハッシュ持っている:私はこのハッシュのDUPが必要ルビーDUP /クローン再帰的に
h = {'name' => 'sayuj',
'age' => 22,
'project' => {'project_name' => 'abc',
'duration' => 'prq'}}
は、変更が元のハッシュに影響はありません。 project
は別のハッシュオブジェクトであるため、
私がしよう
、ここでd = h.dup # or d = h.clone
d['name'] = 'sayuj1'
d['project']['duration'] = 'xyz'
p d #=> {"name"=>"sayuj1", "project"=>{"duration"=>"xyz", "project_name"=>"abc"}, "age"=>22}
p h #=> {"name"=>"sayuj", "project"=>{"duration"=>"xyz", "project_name"=>"abc"}, "age"=>22}
あなたがproject['duration']
を見ることができますが、元のハッシュに変更されます。
ハッシュをduped
またはcloned
に再帰します。どうすればこれを達成できますか?ここで
これは、「h」によって参照されるすべてのオブジェクトの完全なコピーを作成します。これは、単純なStringハッシュに対してSayujが必要とするものと正確に同じである可能性があります。より複雑なオブジェクトでは、これはもはや望ましくないかもしれません。 'Hash#dup'メソッドをオーバーライドして' values'のすべてのハッシュを再帰的にdupすることができました。しかし、それはすべてのオブジェクトタイプに対して拡張する必要があります。 –
@HolgerJust:はい、そのため「ディープコピー」と呼ばれています:-) –
もちろんです。私はそれが意図したOP以上のものをするかもしれないと言いたがっています(おそらくちょうどいいです):)それはまあ、将来の参考にすぎません。 –