Why D is annoying =P

H. S. Teoh hsteoh at quickfur.ath.cx
Thu Oct 25 21:19:13 PDT 2012


On Thu, Oct 25, 2012 at 06:34:32PM -0700, Ellery Newcomer wrote:
> On 10/24/2012 01:16 PM, Mehrdad wrote:
> >On Wednesday, 24 October 2012 at 20:03:44 UTC, H. S. Teoh wrote:
> >>What's wrong with RedBlackTree? You can just do something like:
> >>
> >>    RedBlackTree!(RedBlackTree!MySet) setOfSets;
> >
> >The last time I checked two RedBlackTrees for equality, they seemed
> >to have reference semantics...
> >
> 
> Dang.
> 
> import std.container;
> import std.stdio;
> 
> void main() {
>     auto a = make!(RedBlackTree!int)(1,2,3,4);
>     auto b = make!(RedBlackTree!int)(1,2,3,4);
>     writeln(a == b);
> }
> 
> prints
> 
> false
> 
> 
> Explanation: RedBlackTree doesn't override opEquals. Either file an
> enhancement request or use equal(a[], b[]), depending on whether
> opEquals *should* have reference semantics.

Hmph. This is what I don't like about the built-in ==. Its semantics are
inconsistent once you leave the realm of ints and floats and other
numerical types. I think this one is worthy of a bug report.


> Actually, it shouldn't, since that would differ from array/string
> opEquals semantics.

Yeah, Jonathan is right, "==" should *always* do a deep compare, and
leave "is" to do a shallow compare. Anything else is inconsistent, and
leads to all kinds of pathological bugs.


T

-- 
Любишь кататься - люби и саночки возить. 


More information about the Digitalmars-d mailing list