Why to have properties to sort or duplicate arrays ?
Kevin Bealer
kevinbealer at gmail.com
Sun Jan 28 03:31:14 PST 2007
Derek Parnell wrote:
> On Sat, 27 Jan 2007 18:00:10 -0500, Pierre Renié wrote:
>
>> Hello,
>> To me, reading a field or a property should not modify the object.
>> The problem is that just an access to the properties 'reverse'
>> or 'sort' are modifying my array. These 2 properties should be
>> method instead.
>>
>> I think that the property 'dup' should be a method too, because
>> 'dup' is not a value of my Array object, it does something.
>
> Yes, this is a significant design mistake that has always been with us.
>
> I suspect it came about with the desire to make properties easy to create
> and use, but as a consequence, D properties aren't as useful as they could
> be. They are certainly a good thing but still not as good as they could
> have been.
>
> I believe that a 'get' Property should return a value without changing the
> entity that owns the value.
>
> I don't have an issue with the .dup property in this regard as it returns a
> copy of the entity; however it is not built-in to all datatypes, just
> arrays.
>
> But .sort and .reverse should just return a copy of the data, sorted or
> reversed respectively.
>
> I'm pretty sure that Walter will not be changing this or improving the
> Property concept any time soon though. So use this idiom instead ...
>
> (sorted_data = data.dup).sort;
> (reversed_data = data.dup).reverse;
>
A functional programming language would probably do that but personally
I prefer the in-place sort. The majority of the time, I would just have
to assign the sorted version back over the original, which means I've
done a copy to a heap allocated array for no benefit. In the few cases
that I need a copy, I can use a dup as you describe.
Another problem with returning a copy of the data, is that static arrays
like int[5] would return a dynamic array, which would require awkward
syntax:
int[5] foo;
// fill foo
// unnecessary copy, allocation, gc collection
int[] f2 = foo.sort();
// another unnecessary copy
foo[] = f2[];
Kevin
More information about the Digitalmars-d
mailing list