clone and dup

Discussion in 'Ruby' started by Keith P. Boruff, Jan 26, 2005.

  1. After reading about these two methods for the Object class in "Pragmatic
    Programmer", I'm still having a hard time understanding the differences.
    Can someone point me to some better info on these or explain it (I do
    understand the differences between deep and shallow copying).

    Also, in some of the std modules I've peeked at like Find for instance, this
    is called for the args:

    def find(*paths)
    paths.collect! { |d| d.dup }
    ...
    end

    Why would one dup the args in place? I definitely don't understand this.

    Thanks,
    KPB
    Keith P. Boruff, Jan 26, 2005
    #1
    1. Advertising

  2. "Keith P. Boruff" <> schrieb im Newsbeitrag
    news:89KJd.989$...
    > After reading about these two methods for the Object class in "Pragmatic
    > Programmer", I'm still having a hard time understanding the differences.
    > Can someone point me to some better info on these or explain it (I do
    > understand the differences between deep and shallow copying).


    They do both shallow copy.

    Here's a difference:

    >> s="foo".freeze

    => "foo"
    >> s.frozen?

    => true
    >> s.clone.frozen?

    => true
    >> s.dup.frozen?

    => false

    > Also, in some of the std modules I've peeked at like Find for instance,

    this
    > is called for the args:
    >
    > def find(*paths)
    > paths.collect! { |d| d.dup }
    > ...
    > end
    >
    > Why would one dup the args in place? I definitely don't understand this.


    Probably because the path names are modified later on and the implementer
    of find wanted to avoide side effects on the arguments. Or he wanted to
    make sure that modifications to the argument objects don't affect find()
    as it is likely to run comparatively long compared to other methods.

    Kind regards

    robert
    Robert Klemme, Jan 26, 2005
    #2
    1. Advertising

  3. Keith P. Boruff

    Csaba Henk Guest

    On 2005-01-26, Robert Klemme <> wrote:
    >
    > "Keith P. Boruff" <> schrieb im Newsbeitrag
    > news:89KJd.989$...
    >> After reading about these two methods for the Object class in "Pragmatic
    >> Programmer", I'm still having a hard time understanding the differences.
    >> Can someone point me to some better info on these or explain it (I do
    >> understand the differences between deep and shallow copying).

    >
    > They do both shallow copy.
    >
    > Here's a difference:
    >
    >>> s="foo".freeze

    >=> "foo"
    >>> s.frozen?

    >=> true
    >>> s.clone.frozen?

    >=> true
    >>> s.dup.frozen?

    >=> false


    Or:

    irb(main):189:0> o=Object.new
    => #<Object:0x414c1f54>
    irb(main):190:0> def o.foo; end
    => nil
    irb(main):191:0> o2=o.clone
    => #<Object:0x414be1b0>
    irb(main):192:0> o2.foo
    => nil
    irb(main):193:0> o3=o.dup
    => #<Object:0x414baee8>
    irb(main):194:0> o3.foo
    NameError: undefined method `foo' for #<Object:0x414baee8>
    from (irb):194
    from /usr/lib/ruby/1.8/yaml/rubytypes.rb:67

    Csaba
    Csaba Henk, Jan 26, 2005
    #3
  4. Robert Klemme wrote:

    > They do both shallow copy.
    >
    > Here's a difference:
    >
    >>> s="foo".freeze

    > => "foo"
    >>> s.frozen?

    > => true
    >>> s.clone.frozen?

    > => true
    >>> s.dup.frozen?

    > => false


    So it looks like the major difference is that clone copies the state of the
    original object and dup doesn't? At least in the context of "freeze"?

    > Probably because the path names are modified later on and the implementer
    > of find wanted to avoide side effects on the arguments. Or he wanted to
    > make sure that modifications to the argument objects don't affect find()
    > as it is likely to run comparatively long compared to other methods.


    Got it! Thanks!

    KPB
    Keith P. Boruff, Jan 26, 2005
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Alexey Verkhovsky
    Replies:
    1
    Views:
    111
    George Ogata
    Apr 3, 2004
  2. Robert Klemme
    Replies:
    5
    Views:
    186
  3. Raj Sahae

    dup and clone

    Raj Sahae, Mar 1, 2007, in forum: Ruby
    Replies:
    4
    Views:
    118
    Gary Wright
    Mar 1, 2007
  4. François Beausoleil

    :s.respond_to?(:dup) && :s.dup raises

    François Beausoleil, Apr 5, 2007, in forum: Ruby
    Replies:
    1
    Views:
    98
    Tim Hunter
    Apr 5, 2007
  5. Luka Stolyarov
    Replies:
    10
    Views:
    288
    Thomas Sondergaard
    Sep 11, 2010
Loading...

Share This Page