Bạn có biết rằng bạn có thể sao chép một đối tượng trong Ruby không? Không chỉ vậy, có hai phương pháp khác nhau để thực hiện việc này!
Các phương pháp này là :
-
dup
-
clone
Chúng ta sẽ khám phá sự khác biệt trong giây lát, nhưng trước tiên…
Tại sao bạn muốn sao chép một đối tượng ?
Nhiều đối tượng trong Ruby có thể thay đổi, bạn có thể thay đổi chúng.
Nếu bạn muốn thay đổi một đối tượng nhưng giữ một bản sao của bản gốc thì bạn có thể sao chép nó.
Ví dụ.
Bạn có thể muốn một mảng có tất cả các phần tử trừ phần tử đầu tiên.
Một cách để thực hiện việc này :
a =[1,2,3,4,5] a [1 ..- 1] # [2,3,4,5]
Một cách khác sẽ là :
b =a.cloneb.shift # [1] b # [2,3,4,5]
Cả hai ví dụ đều cho phép bạn giữ nguyên mảng ban đầu.
Đối tượng đông lạnh
Sao chép &nhân bản không phải là một bí danh của nhau giống như nó xảy ra với các phương thức Ruby khác (bản đồ / thu thập), có một vài khác biệt nhỏ giữa chúng.
Khám phá sự giống và khác biệt giữa hai điều là một cách tuyệt vời để cải thiện sự hiểu biết của bạn .
Cả hai phương pháp đều sao chép một đối tượng, sự khác biệt là dup
không sao chép các thuộc tính đối tượng.
Thuộc tính đối tượng nào?
- trạng thái đóng băng
- tình trạng nhiễm độc
- lớp singleton
Đây là một ví dụ :
a =Object.new.freezeb =a.dupb.frozen? # falseb =a.cloneb.frozen? # true
Ruby 2.4 bao gồm một tùy chọn cho clone
để bỏ qua trạng thái đóng băng của đối tượng được nhân bản.
Ví dụ :
a.clone (đóng băng:đúng) a.clone (đóng băng:sai)
Sao chép sâu so với nông
Có nhiều thứ để sao chép một đối tượng hơn là nhìn bằng mắt.
Khi bạn tạo một bản sao, với dup
hoặc clone
, bạn đang tạo một bản sao cạn .
Điều này có nghĩa là các đối tượng chứa trong các đối tượng khác sẽ không bị sao chép.
Nói cách khác :
Nếu bạn có một mảng chuỗi, chỉ mảng sẽ được sao chép, không phải chính các chuỗi.
Hãy tự mình xem:
original =% w (apple cam banana) copy =original.cloneoriginal.map (&:object_id) # [23506500, 23506488, 23506476] copy.map (&:object_id) # [23506500, 23506488, 23506476]Id đối tượng giống nhau ngay cả sau khi sao chép mảng, vì vậy chúng tôi có các chuỗi giống nhau.
Bạn có thể giải quyết điều đó với điều này:
string.clone.map (&:clone)Điều này dẫn đến việc cả mảng &chuỗi đều được sao chép, nhưng lưu ý rằng điều này chỉ đi sâu một cấp. Bạn có thể thử phương pháp deep_dup từ ActiveSupport để thay thế.
Tóm tắt
Bạn đã học về nhân bản đối tượng trong Ruby! Bao gồm sự khác biệt giữa các phương pháp nhân bản &sao chép và sao chép nông và sao chép sâu.
Cảm ơn vì đã đọc!