【发布时间】:2013-05-16 05:08:33
【问题描述】:
据我了解,当您将 object = 设置为另一个时,它将始终是一个引用,因此我们有像 .dup 和 .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(在此示例中)的引用而不是副本,因为它是包含在散列中的散列数组?
【问题讨论】: