From: Dave Thomas Date: 2000-06-19T12:03:17-05:00 Subject: [ruby-talk:03527] Re: Deep copy? Conrad Schneiker writes: > For the general education of other readers (e.g. myself), could someone > please describe how deep copies are supported (in the sense of built-in > features, if any) in other languages Python, Smalltalk, Eiffel, and > Lisp/CLOS (or Scheme)? The Smalltalk implementation is typical. We assume a protocol (in the Smalltalk case it's simply support for the messages 'copy' and 'postCopy'). Objects are copied using fred := bert copy. # deep copy freda := betha shallowCopy. 'shallowCopy' is implemented in Object, and does the obvious stuff. 'copy' is also implemented in Object, but on its own it doesn't work. Instead, every class that acts as a container has to add support for copying those contained objects. There are two ways of doing this. The brute force way is to override the 'copy' method. Sometimes this is required. However, the tidier way is to implement 'postCopy', whose job is to copy just the contained objects. That's because the default implementation of 'copy' is: copy ^self shallowCopy postCopy. (so the 'shallowCopy' will copy the object itself, and the 'postCopy' then handles the object specific stuff.) For example, postCopy for a bag in Dolphin Smalltalk is implemented as postCopy super postCopy. original := contents. contents := original copyEmpty. original keysAndValuesDo: [:k :v | contents at: k put: v] Regards Dave