On Thursday, 31 January 2013 at 11:35:31 UTC, d coder wrote:
On Thu, Jan 31, 2013 at 2:43 PM, Robert burner Schadek
<[email protected]> wrote:
Thats not totally correct. The Rb tree is a class. But the
real reason for
the Deque being a class
is that it holds two value members. And if you pass the Deque
around you
need to do this as ref.
Otherwise you shall not call any method that modifies this
value members,
because this will only be
visible at the calling site.
I would expect all the containers in the std.container to have
either
pass by value or pass by reference semantics. It seems at least
Array,
Slist, and Dlist are structs and they follow pass by value
semantics.
From Dlang.org:
auto a = DList!int([3, 4]); //Create a new chain
auto b = a; //Point to the same chain
// (3 - 4)
assert(a[].equal([3, 4]));
assert(b[].equal([3, 4]));
b.stableInsertFront(1); //insert before of b
b.stableInsertBack(5); //insert after of b
// (2 - (3 - 4) - 5)
assert(a[].equal([3, 4])); //a is not changed
assert(b[].equal([1, 3, 4, 5])); // but b is changed
Regards
- Puneet
Technically, all containers in std.container need to adhere to
reference semantics when passed by value, regardless of if they
are classes or structs.
For example, AA's can be considered structs, but when passed,
they still adhere to reference semantics.
---------
In regards to DList: I wrote that code and documentation.
The truth is that DList was written with absolutely 0 concern to
what might happen if you mutate a copy. While correcting the
code, I preserved the old semantic (accidental) semantic, which
was kind of weird.
The mistake was to document said semantic. It makes no sense. I
should never even have preserved that semantic in the first place
anyways. There is now a new version in the tubes for Dlist, to
make it behave the way you'd expect it to:
https://github.com/D-Programming-Language/phobos/pull/953
The pull is kind of stuck in limbo, specifically because of the
problems associated with implementing reference semantics with
structs :/