Taking a copy of an object
Derek
derek at psyc.ward
Thu Aug 3 15:46:00 PDT 2006
On Thu, 03 Aug 2006 14:26:08 +0100, Bruno Medeiros wrote:
> Derek Parnell wrote:
>> Currently there doesn't seem to be any standard D mechanism (read:
>> operator) to take a copy of an object. So are there any suggestions for a
>> name that we can all agree on; one that might become an unofficial
>> standard?
>>
>> For arrays we have the 'dup' property but for objects there is nothing that
>> the compiler assumes. I'm partial to 'onDup' or 'onCopy', and maybe even a
>> 'onDeepCopy' as an additional function.
>>
>> Example:
>>
>> class Foo
>> {
>> int x;
>> Bar b;
>>
>> this(int y)
>> {
>> x = y;
>> b = new Bar(y);
>> }
>>
>> Foo onCopy()
>> {
>> Foo t;
>> t = new Foo(x);
>> return t;
>> }
>> }
>>
>> . . .
>>
>> auto backup = q.onCopy();
>>
>
> What's the "on" prefix for? I think the name should be something like:
The 'on' prefix is a *hint* to Walter that I'd really like this function to
be invoked via a new operator and not necessariliy called directly.
> dup()
> Clone()
> Copy()
> and it should exist by default in the Object class, with a default
> implementation that does a shallow copy.
Yes, a default shallow copy defined in Object would be a good idea. In that
case an operator would not be needed for shallow copying.
> Also, it is redundant to specify a shallow copy function for each class:
> the code is the same for any class. It is something like:
> Object ShallowCopy(Object obj) {
> int len = obj.classinfo.init.length;
> auto data = (cast(ubyte*) obj)[0..len];
> return cast(Object) data.dup.ptr;
> }
> So there should not be two different functions for each kind of copy,
> there should be only one, which conceptually is defined to do a deep copy.
Not sure I agree here. The shallow copy coulod be generic as you
demonstrated, but a deep copy is very Object-specific and would need to be
defined in the class that needed it.
--
Derek Parnell
Melbourne, Australia
"Down with mediocrity!"
More information about the Digitalmars-d
mailing list