2011-12-22 41 views
11

Tôi muốn nhận được một đối tượng về sản xuất và thực hiện một bản sao chính xác (sao chép nội dung của nó) sang đối tượng khác cùng loại. Tôi đã cố gắng làm điều này trong 3 cách từ ruby ​​console mà không ai trong số họ làm việc:Bản sao sâu của mảng trong Ruby

  1. Hãy nói rằng bạn có tt là đối tượng đầu tiên mà bạn muốn sao chép và tt2 như các đối tượng bản sao. Cách tiếp cận đầu tiên tôi đã cố gắng được nhân bản mảng

    tt2.patients = tt.urls.patients 
    tt2.doctors = tt.segments.doctors 
    tt2.hospitals = tt.pixels.hospitals 
    
  2. cách tiếp cận thứ hai tôi đã cố gắng được nhân đôi mảng mà thực sự là giống như nhân bản mảng:

    tt2.patients = tt.patients.dup 
    tt2.doctors = tt.doctors.dup 
    tt2.hospitals = tt.hospitals.dup 
    
  3. cách tiếp cận thứ ba tôi đã cố gắng được 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)) 
    

Không ai trong số các công trình trên để sao chép sâu từ một mảng khác. Sau khi thử từng cách tiếp cận riêng lẻ ở trên, tất cả các nội dung của đối tượng đầu tiên (tt) đều bị vô hiệu hóa (bệnh nhân, bác sĩ và bệnh viện đã biến mất). Bạn có ý tưởng nào khác về việc sao chép nội dung của một đối tượng này sang đối tượng khác không? Cảm ơn.

+1

Bạn chỉ đang đặt biến của mình trong ví dụ đầu tiên. Hãy thử tt2.patients = tt.patiens.clone để thay thế. – three

Trả lời

15

dễ dàng!

@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 
+0

Công trình này tuyệt vời. new_tt có tất cả thông tin tôi cần bây giờ. Tuy nhiên, tất cả các nội dung của tt2 (bệnh nhân, bác sĩ, bệnh viện) đều biến mất sau khi làm những gì bạn đã nói với tôi ở trên. Làm cách nào để giữ nội dung của tt2? –

+0

Woops! Tôi đã có một sai lầm cú pháp ở đó. Tôi đã cập nhật mã ở trên. Hãy dùng thử. – Trip

+0

Điểm khác biệt giữa điều này và cách tiếp cận thứ hai của anh là gì? –

2

Ruby Facets là bộ tiện ích mở rộng hữu ích cho Ruby và có phương thức deep_clone có thể phù hợp với bạn.

Các vấn đề liên quan