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.
"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.
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).
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.