On Sunday, 17 August 2014 at 07:33:01 UTC, ketmar via
Digitalmars-d wrote:
On Thu, 14 Aug 2014 06:46:40 +0000
Andrew Godfrey via Digitalmars-d <[email protected]>
wrote:
sorry for the late answer.
Don't think I'm being flippant, but I have trouble
interpreting such feedback, because D's dynamic array
semantics ARE complicated.
and it will be even more complicated if we will rename 'em to
'array
references'.
i completely agree that D dynarray docs can be made clearer and
i
appreciate any efforts which makes docs better. i'm just against
'reference' term -- seems that i'm from that minority that
becomes
immediately confused when reading 'array reference'. what i
expect from
'reference' is that this code works:
void foo (int[] a) {
a ~= 42;
}
...
int[] arr;
arr ~= 666;
foo(arr);
assert(arr.length == 2 && arr[1] == 42);
but it doesn't. so arrays clearly aren't 'references' (as
'reference',
to my opinion, should keep 'pass by reference' semantics in
this case).
so maybe we should coin some new word to describe dynarrays in
D.
Maybe. But consider that if "a" was a class and "~=" was instead
"=", you would have the same confusion. As in:
void foo(MyClass a) {
a = new MyClass;
}
In either case, we are "passing a reference by value".
So operations on the referent affect the passed object/array, but
operations
on the reference do not.
The further surprise is caused because concatenation affects the
_reference_.
In fact it doesn't affect the referent at all!
Good example. Consider that this works:
void foo (int[] a) {
a[0] = 42;
}
int[] arr;
arr ~= 666;
foo(arr);
assert(arr.length == 1 && arr[0] == 42);