alias this and opDot()

user1234 user1234 at 12.de
Wed Sep 28 06:44:37 UTC 2022


On Wednesday, 28 September 2022 at 06:39:30 UTC, user1234 wrote:
> On Wednesday, 28 September 2022 at 03:45:59 UTC, Salih Dincer 
> wrote:
>> Ok, opDot() is deprecated in version 2.082. However, if we 
>> simulate this situation with a function (opdot in our 
>> example), we get unexpected results.
>>
>> ```d
>> struct Point { int x, y; }
>>
>> struct S
>> {
>>     Point point;
>>     alias opdot this;
>>
>>     auto opdot()
>>     { // opDot() is deprecated in v2.082
>>       //this.point = Point(100, 100);/* <-- also if you only 
>> use: s == Point(100, 101)
>>         point.x = 100;
>>         point.y = 100;
>>         point.x++;//*/
>>
>>         return &point;
>>     }
>> }
>>
>> void main()
>> {
>>     S s;
>>     s.x++; // as if this line doesn't exist!
>>     s.y++;
>>
>>     //s.x++; //  <-- also if you use: s == Point(102, 100)
>>     assert(s.point == Point(101, 101));
>> }
>> ```
>>
>> SDB at 79
>
> opdot is called two times so you reset the state of point 
> members 100
>
> ```d
> struct Point { int x, y; }
>
> struct S
> {
>     Point point;
>     alias opdot this;
>
>     Point* opdot() return
>     {
>         this.point.x = 100;
>         this.point.y = 100;
>         return &this.point;
>     }
> }
>
> void main()
> {
>     S s;
>     s.x += 1;
>     assert(s.point == Point(101, 100));
>     s.y += 1;
>     assert(s.point == Point(100, 101));
> }
> ```

I realize that maybe you are aware of what's happening, in which 
case you need to use opDispatch instead

```d
struct Point { int x, y; }

struct S
{
     Point point;

     auto ref opDispatch(string member)() return
     {
         return __traits(getMember, point, member);
     }
}

void main()
{
     S s;
     s.x += 1;
     assert(s.point == Point(1, 0));
     s.y += 1;
     assert(s.point == Point(1, 1));
}
```


More information about the Digitalmars-d mailing list