Thread overview | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
|
March 10, 2017 Comparing Instances of Classes | ||||
---|---|---|---|---|
| ||||
Hi, I am trying to compare two instances of a class. I created a test program to try this, but every method I use to compare the instances always returns false. this is my code to test comparison class A { this() { } } void main() { A a = new A(); A a2 = new A(); writeln(equals(a, a2)); } bool equals(Object obj1, Object obj2) { return (obj1 is obj2); } I have tried 'a is a2', I have tried 'a1 == a2' and many other ways (including opEquals from object.d) among other things and every single time the comparison returns false. The comparison always fails and never returns true. I am trying to do something like Object.equals(Object o) in java, but so far, no success. Am I missing something here? |
March 10, 2017 Re: Comparing Instances of Classes | ||||
---|---|---|---|---|
| ||||
Posted in reply to DRex | On Friday, 10 March 2017 at 16:08:05 UTC, DRex wrote:
> Am I missing something here?
Yeah, you need to implement a custom equality operator.
class A {
int member;
override bool opEquals(const A rhs) {
return this.member == rhs.member; // and other members that need to be equal
}
}
The default opEquals sees if they are the same *instance* (same as `a is b`), and does not look at contents. You need to define that yourself.
|
March 10, 2017 Re: Comparing Instances of Classes | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adam D. Ruppe | On Friday, 10 March 2017 at 16:13:21 UTC, Adam D. Ruppe wrote:
> On Friday, 10 March 2017 at 16:08:05 UTC, DRex wrote:
>> Am I missing something here?
>
> Yeah, you need to implement a custom equality operator.
>
> class A {
> int member;
> override bool opEquals(const A rhs) {
> return this.member == rhs.member; // and other members that need to be equal
> }
> }
>
>
> The default opEquals sees if they are the same *instance* (same as `a is b`), and does not look at contents. You need to define that yourself.
I tried the above class A, and now the compiler fails with the following error:
Error: function app.A.opEquals does not override any function, did you mean to override 'object.Object.opEquals'?
My A class appears exactly as mentioned in your comment...
|
March 10, 2017 Re: Comparing Instances of Classes | ||||
---|---|---|---|---|
| ||||
Posted in reply to DRex | On Friday, 10 March 2017 at 16:22:18 UTC, DRex wrote:
> Error: function app.A.opEquals does not override any function, did you mean to override 'object.Object.opEquals'?
Oh sorry, maybe I messed up the const. Try:
override bool opEquals(A rhs) { ... }
and if the compiler still complains change the A to Object and cast it inside (but I'm pretty sure that will work, I think it is just const it is picky about)
|
March 10, 2017 Re: Comparing Instances of Classes | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adam D. Ruppe | On Friday, 10 March 2017 at 16:30:00 UTC, Adam D. Ruppe wrote:
> On Friday, 10 March 2017 at 16:22:18 UTC, DRex wrote:
>> Error: function app.A.opEquals does not override any function, did you mean to override 'object.Object.opEquals'?
>
> Oh sorry, maybe I messed up the const. Try:
>
> override bool opEquals(A rhs) { ... }
>
>
> and if the compiler still complains change the A to Object and cast it inside (but I'm pretty sure that will work, I think it is just const it is picky about)
Thanks.
I'm fairly new to D, but this seems to be quite a pain in the rear for a simple comparison of instances of classes...really odd that comparing instances of classes in D requires that messing around when D seems all about simplifying things...
|
March 10, 2017 Re: Comparing Instances of Classes | ||||
---|---|---|---|---|
| ||||
Posted in reply to DRex | On Friday, 10 March 2017 at 16:36:17 UTC, DRex wrote:
> I'm fairly new to D, but this seems to be quite a pain in the rear for a simple comparison of instances of classes...really odd that comparing instances of classes in D requires that messing around when D seems all about simplifying things...
There often is no sensible default comparison for class contents (now structs on the other hand do have a default comparison that usually works, but structs don't have to worry about polymorphism), so you just need to specify what fields actually matter to your code...
|
March 10, 2017 Re: Comparing Instances of Classes | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adam D. Ruppe | On Friday, 10 March 2017 at 16:47:47 UTC, Adam D. Ruppe wrote:
> On Friday, 10 March 2017 at 16:36:17 UTC, DRex wrote:
>> I'm fairly new to D, but this seems to be quite a pain in the rear for a simple comparison of instances of classes...really odd that comparing instances of classes in D requires that messing around when D seems all about simplifying things...
>
> There often is no sensible default comparison for class contents (now structs on the other hand do have a default comparison that usually works, but structs don't have to worry about polymorphism), so you just need to specify what fields actually matter to your code...
I guess i am just too used to the java way of x.equals(object) which at the source is exactly 'return this == object'
|
March 10, 2017 Re: Comparing Instances of Classes | ||||
---|---|---|---|---|
| ||||
Posted in reply to DRex | On 03/10/2017 08:22 AM, DRex wrote: > Error: function app.A.opEquals does not override any function, did you > mean to override 'object.Object.opEquals'? > > My A class appears exactly as mentioned in your comment... FWIW, here's some other info: http://ddili.org/ders/d.en/object.html#ix_object.opEquals Ali |
March 10, 2017 Re: Comparing Instances of Classes | ||||
---|---|---|---|---|
| ||||
Posted in reply to Whatsthisnow | On Friday, 10 March 2017 at 17:08:42 UTC, Whatsthisnow wrote:
> I guess i am just too used to the java way of x.equals(object) which at the source is exactly 'return this == object'
Java would return false here too, though, if it actually did `this == object` in its default compare method. If I remember correctly, comparing two objects with == in Java compares their addresses, not their contents.
|
March 11, 2017 Re: Comparing Instances of Classes | ||||
---|---|---|---|---|
| ||||
Posted in reply to Meta | On Friday, 10 March 2017 at 20:27:09 UTC, Meta wrote:
> On Friday, 10 March 2017 at 17:08:42 UTC, Whatsthisnow wrote:
>> I guess i am just too used to the java way of x.equals(object) which at the source is exactly 'return this == object'
>
> Java would return false here too, though, if it actually did `this == object` in its default compare method. If I remember correctly, comparing two objects with == in Java compares their addresses, not their contents.
I must be losing my mind then
|
Copyright © 1999-2021 by the D Language Foundation