Clone and dup

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" <kboruff@optonline.net> schrieb im Newsbeitrag
news:89KJd.989$HR6.889@fe10.lga...

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

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

···

On 2005-01-26, Robert Klemme <bob.news@gmx.net> wrote:

"Keith P. Boruff" <kboruff@optonline.net> schrieb im Newsbeitrag
news:89KJd.989$HR6.889@fe10.lga...

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

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