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

Returns:



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);
}