On Saturday, 5 September 2015 at 09:45:36 UTC, Jacob Carlborg wrote:
On 2015-09-05 08:26, Jonathan M Davis wrote:

Clearly, you haven't read TDPL recently enough. ;)

There is a free function, opEquals, in object.d which gets called for classes, and _it_ is what == gets translated to for classes, and it
calls the member function version of opEquals on classes:

https://github.com/D-Programming-Language/druntime/blob/master/src/object.d#L143


This allows us to avoid a number of fun bugs with opEquals that you get in languages like Java and makes it completely unnecessary to do stuff like check whether the argument to opEquals is null. Timon gave the link
to the explanation in the spec:

Bu you don't see my example as a problem?

Well, it might be a bit annoying, but it's simply a matter of adjusting your code to call opEquals explicitly when trying to call the base version, whereas without the free function opEquals, you have subtle correctness problems. For instance, if you have base == derived and derived == base, you'll get the same result for both for D, whereas the equivalent Java or C# could would likely not, because the free function opEquals checks both lhs.opEquals(rhs) and rhs.OpEquals(lhs) whether you did base == derived or derived == base.

So, while what we have is by no means perfect, I think that it is an improvement over what Java and C# did.

- Jonathan M Davis

Reply via email to