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