Глубокая копия массивов в Ruby

Я хотел получить объект на производстве и сделать точную копию (скопировать ее содержимое) на другой объект того же типа. Я попытался сделать это тремя способами с консоли ruby, из которой никто из них не работал:

  • Скажем, у вас есть tt как первый объект, который вы хотите скопировать, и tt2 в качестве объекта реплики. Первый подход, который я пробовал, - клонирование массива

    tt2.patients  = tt.urls.patients
    tt2.doctors   = tt.segments.doctors
    tt2.hospitals = tt.pixels.hospitals
    
  • Второй подход, который я пробовал, - это дублирование массива, который фактически совпадает с клонированием массива:

    tt2.patients  = tt.patients.dup
    tt2.doctors   = tt.doctors.dup
    tt2.hospitals = tt.hospitals.dup
    
  • Третий подход, который я пробовал, - marhsalling.

    tt2.patients  = Marshal.load(Marshal.dump(tt.patients)) 
    tt2.doctors   = Marshal.load(Marshal.dump(tt.doctors)) 
    tt2.hospitals = Marshal.load(Marshal.dump(tt.hospitals)) 
    

Ни одно из вышеперечисленных работ не предназначено для глубокого копирования из одного массива в другой. После каждого индивидуального подхода каждый элемент первого содержания (tt) аннулируется (пациенты, врачи и больницы исчезли). Есть ли у вас какие-либо другие идеи по копированию содержимого одного объекта в другой? Спасибо.

Ответ 1

Легко!

@new_tt            = tt2.clone
@new_tt.patients   = tt2.patients.dup
@new_tt.doctors    = tt2.doctors.dup
@new_tt.hospitals  = tt2.hospitals.dup
@new_tt.save

Ответ 3

Ruby Facets - это набор полезных расширений для Ruby и deep_clone, который может сработать для вас.