Насколько я понимаю, когда вы устанавливаете объект = другому, это всегда будет ссылка, поэтому у нас есть такие методы, как .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
(в этом примере) вместо копии, потому что это массив хэшей, содержащихся внутри хеша?