Method: Object#dup
- Defined in:
- object.c
#dup ⇒ Object
Produces a shallow copy of obj—the instance variables of obj are copied, but not the objects they reference.
This method may have class-specific behavior. If so, that behavior will be documented under the #initialize_copy
method of the class.
on dup vs clone
In general, #clone and #dup may have different semantics in descendant classes. While #clone is used to duplicate an object, including its internal state, #dup typically uses the class of the descendant object to create the new instance.
When using #dup, any modules that the object has been extended with will not be copied.
class Klass
attr_accessor :str
end
module Foo
def foo; 'foo'; end
end
s1 = Klass.new #=> #<Klass:0x401b3a38> s1.extend(Foo) #=> #<Klass:0x401b3a38> s1.foo #=> “foo”
s2 = s1.clone #=> #<Klass:0x401be280> s2.foo #=> “foo”
s3 = s1.dup #=> #<Klass:0x401c1084> s3.foo #=> NoMethodError: undefined method ‘foo’ for #<Klass:0x401c1084>
625 626 627 628 629 630 631 632 633 634 635 |
# File 'object.c', line 625 VALUE rb_obj_dup(VALUE obj) { VALUE dup; if (special_object_p(obj)) { return obj; } dup = rb_obj_alloc(rb_obj_class(obj)); return rb_obj_dup_setup(obj, dup); } |