Đúng là clone
sao chép frozen
trạng thái của một đối tượng, trong khi dup
không:
o = Object.new
o.freeze
o.clone.frozen?
#=> true
o.dup.frozen?
#=> false
clone
cũng sẽ sao chép các phương thức singleton của đối tượng trong khi dup
không:
o = Object.new
def o.foo
42
end
o.clone.respond_to?(:foo)
#=> true
o.dup.respond_to?(:foo)
#=> false
Điều này dẫn tôi đến giả định rằng clone
đôi khi được hiểu là cung cấp bản sao "sâu hơn" hơn dup
. Dưới đây là một số trích dẫn về chủ đề:
Comment on ActiveRecord::Base#initialize_dup
from Rails 3:
đối tượng lừa đã không có id được giao và được coi là kỷ lục mới. Lưu ý rằng đây là bản sao "nông" vì bản sao chỉ sao chép thuộc tính của đối tượng , chứ không phải các liên kết của đối tượng. Mức độ của một bản sao "sâu" là ứng dụng cụ thể và do đó là trái với các ứng dụng để thực hiện theo nhu cầu của nó.
An article about deep copies in Ruby:
Có một phương pháp đáng nói, clone
. Phương pháp clone
thực hiện tương tự như dup
với một sự phân biệt quan trọng: nó được mong đợi rằng các đối tượng sẽ ghi đè phương thức này với một đối tượng có thể làm các bản sao sâu.
But then again, theres deep_dup
in Rails 4:
Trả về một bản sao sâu sắc về đối tượng nếu nó duplicable. Nếu không trùng lặp, trả về self
.
and also ActiveRecord::Core#dup
and #clone
in Rails 4:
clone
- giống hệt với phương pháp nhân bản của Ruby. Đây là bản sao "nông". Được cảnh báo rằng các thuộc tính của bạn không được sao chép. [...] Nếu bạn cần một bản sao băm thuộc tính của mình, vui lòng sử dụng phương thức #dup
.
Điều đó có nghĩa là ở đây, từ dup
được sử dụng để chỉ lại bản sao sâu. Theo như tôi thấy, có vẻ như không có sự đồng thuận trong cộng đồng, ngoại trừ việc bạn nên sử dụng clone
và dup
trong trường hợp khi bạn cần một tác dụng phụ cụ thể của một trong hai.
Cuối cùng, tôi thấy dup
thường xuyên hơn trong mã Ruby so với clone
. Tôi chưa bao giờ sử dụng clone
cho đến nay, và tôi sẽ không cho đến khi tôi rõ ràng cần phải.
Bản sao có thể có của [Sự khác nhau giữa phương pháp sao chép và sao chép của Ruby là gì?] (Http://stackoverflow.com/questions/10183370/whats-the-difference-between-rubys-dup-and-clone-methods) – OlehZiniak