Из того, что я понимаю, когда вы устанавливаете объект = другому, он всегда будет ссылкой, поэтому у нас есть методы, такие как .dup
и .clone
, чтобы фактически создать копия объекта, а не ссылка.Ruby hash.delete (: key) Удаление копий и клонов также
Однако я дублирую или клонирую массив хэшей, а затем, когда я удаляю ключ из исходного хеша, они удаляются из копий! Это не должно произойти, мне интересно, что я делаю неправильно.
Код:
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
(в этом примере) вместо копии, потому что это массив хэшей, содержащийся внутри хэша?