据我了解,当您将 object = 设置为另一个时,它将始终是一个引用,因此我们有类似.dup
and的方法.clone
来实际创建对象的副本而不是引用。
但是,我正在复制或克隆一个哈希数组,然后当我从原始哈希中删除一个键时,它们将从副本中删除!这不应该发生,我想知道我做错了什么。
代码:
or_data = {title: 'some title', tracks: [ { name: 'track one', position: 0,
artist: 'orignal artist', composer: 'original composer', duration: '1:30' },
{ name: 'track two', position: 1, artist: 'some other guy',
composer: 'beethoven', duration: '2:10' } ] }
new_hash = or_data.dup
# or new_hash = or_data.clone, either way produces the same result
or_data[:tracks].each { |e| e.delete(:position) }
密钥也将从中:position
删除new_hash
!
无论我使用.dup
还是,都会发生这种情况.clone
。
我刚刚读到一篇文章说应该使用:
new_hash = Marshal.load( Marshal.dump(or_data) )
这确实有效。但为什么?因为.dup
并且.clone
做“浅拷贝”意味着他们将创建一个引用:tracks
(在这个例子中)而不是一个副本,因为它是一个包含在哈希中的哈希数组?