[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

clone and dup

Keith P. Boruff

1/26/2005 10:12:00 AM

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
3 Answers

Robert Klemme

1/26/2005 10:45:00 AM

0


"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

Csaba Henk

1/26/2005 2:27:00 PM

0

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

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

Keith P. Boruff

1/26/2005 11:15:00 PM

0

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