Cả hai tạo shallow copy của object — instance variable được sao chép theo tham chiếu (nested object vẫn là cùng 1 object). Điểm khác biệt:
dup | clone | |
|---|---|---|
| Giữ frozen state | Không — luôn tạo object mutable | Có — copy vẫn frozen nếu original frozen |
| Giữ singleton methods | Không | Có |
| Giữ extended modules | Không | Có |
ruby
original = "hello".freeze
original.dup.frozen? # => false — unfrozen copy
original.clone.frozen? # => true — vẫn frozen
# Singleton method
obj = Object.new
def obj.greet = "hi"
obj.dup.greet # => NoMethodError — singleton không được copy
obj.clone.greet # => "hi"Quy tắc: dup khi muốn bản sao mutable sạch; clone khi cần giữ nguyên tính chất object.
Both create a shallow copy — instance variables are copied by reference (nested objects remain the same). Key differences:
dup | clone | |
|---|---|---|
| Preserves frozen state | No — always creates mutable copy | Yes — copy is frozen if original is frozen |
| Preserves singleton methods | No | Yes |
| Preserves extended modules | No | Yes |
ruby
original = "hello".freeze
original.dup.frozen? # => false
original.clone.frozen? # => true
# Singleton method
obj = Object.new
def obj.greet = "hi"
obj.dup.greet # => NoMethodError
obj.clone.greet # => "hi"Rule: use dup for a clean mutable copy; use clone when the full character of the object must be preserved.