On Thursday, 5 October 2023 at 16:40:49 UTC, Gaurav Negi wrote:
Well, in the D programming language, both opIndex and opSlice are two different operators used to access elements of a custom type.

Yeah, D is on its way to becoming a near-perfect programming language...

```d
enum initialSituation = [1, 2, 3];
import std.stdio;

void main()
{
  auto s = S(initialSituation);

  s[] = 1;
  s[1] = 2;
  s[2] += 2;
  
  assert(s.arr == initialSituation);

  auto d = s *= 2;
  
  assert(d == S([2, 4, 6]));
}
/* Prints:
[1, 1, 1]: onlineapp.S.opSliceAssign
[1, 2, 1]: onlineapp.S.opIndexAssign
[1, 2, 1]: onlineapp.S.opIndex
[2, 4, 6]: onlineapp.S.opOpAssign!"*".opOpAssign
*/

struct S
{
  int[] arr;

  auto opSliceAssign (int value)
  {
    scope(exit)
    {
      writefln("%s: %s", arr, __FUNCTION__);
    }
    return arr[] = value;
  }

  auto opIndexAssign(int value, int index)
  {
    scope(exit)
    {
      writefln("%s: %s", arr, __FUNCTION__);
    }
    arr[index] = value;
  }

  ref opIndex(size_t index)
  {
    scope(exit)
    {
      writefln("%s: %s", arr, __FUNCTION__);
    }
    return arr[index];
  }

  ref opOpAssign(string op)(int value)
  {
    scope(exit)
    {
      writefln("%s: %s", arr, __FUNCTION__);
    }
    mixin("arr[] " ~ op ~ "=value;");
    return this;
  }
}
```

SDB@79

Reply via email to