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