Bạn có biết rằng bạn có thể sao chép object trong Ruby? Không chỉ thế, mà có hai phương thức khác nhau để làm điều này!
Các phương thức này là:
dupclone
Chúng ta sẽ khám phá sự khác biệt ngay, nhưng trước…
Tại sao bạn muốn clone object?
Nhiều object trong Ruby là mutable (có thể thay đổi).
Nếu bạn muốn thay đổi object nhưng giữ bản sao của bản gốc thì bạn có thể clone nó.
Ví dụ.
Bạn có thể muốn mảng với tất cả phần tử trừ cái đầu tiên.
Một cách làm:
a = [1,2,3,4,5] a[1..-1] # [2,3,4,5]
Cách khác:
b = a.clone b.shift # [1] b # [2,3,4,5]
Cả hai ví dụ cho phép bạn giữ mảng gốc.

Object Đóng băng (Frozen Objects)
Dup & clone không phải là alias của nhau như xảy ra với các phương thức Ruby khác (map/collect), có vài khác biệt nhỏ giữa chúng.
Khám phá điểm giống & khác giữa hai thứ là cách tuyệt vời để cải thiện hiểu biết.
Cả hai phương thức sao chép object, khác biệt là dup không sao chép attribute của object.
Attribute object là gì?
- trạng thái frozen (đóng băng)
- trạng thái tainted (ô nhiễm)
- singleton class
Ví dụ:
a = Object.new.freeze b = a.dup b.frozen? # false b = a.clone b.frozen? # true
Ruby 2.4 bao gồm tùy chọn cho clone để bỏ qua trạng thái frozen của object clone.
Ví dụ:
a.clone(freeze: true) a.clone(freeze: false)
Deep vs Shallow Copying (Sao chép sâu vs nông)
Có nhiều thứ về sao chép object hơn so với surface.
Khi bạn tạo bản sao, với dup hoặc clone, bạn đang tạo shallow copy (bản sao nông).
Điều này nghĩa là object chứa bên trong object khác sẽ không được sao chép.
Nói cách khác:
Nếu bạn có mảng các chuỗi, chỉ mảng được sao chép, không phải các chuỗi chính nó.
Xemด้วย mắt:
original = %w(apple orange banana) copy = original.clone original.map(&:object_id) # [23506500, 23506488, 23506476] copy.map(&:object_id) # [23506500, 23506488, 23506476]
Object ids giống nhau ngay cả sau khi clone mảng, vì vậy chúng ta có cùng chuỗi.
Bạn có thể giải quyết điều đó với:
strings.clone.map(&:clone)
Điều này dẫn đến cả mảng & chuỗi bị clone, nhưng chú ý điều này chỉ đi một level sâu. Bạn có thể thử phương thức deep_dup từ ActiveSupport như lựa chọn thay thế.
Tóm tắt
Bạn đã học về clone object trong Ruby! Bao gồm sự khác biệt giữa phương thức dup & clone, và shallow copy vs deep copy.
Cảm ơn bạn đã đọc!