So, following on from monarchdodra's comment [0] in the bug tracker, how exactly should inout work? For example, should the following work?

----------------------------------------------------
import std.algorithm : map;

class L {
   auto fun(const S s) inout nothrow pure @safe {
      if(point[0] is s)
         return point[1];
      else
         return point[0];
   }
   this(S a, S b) {
      point = [a, b];
   }
   S[2] point;
}

class S {
   @property auto foo() inout nothrow pure @safe {
      return arr.map!(e => e.fun(this));
   }
   L[] arr;
}

void main() { }
----------------------------------------------------


Writing foo imperatively causes no problems with inout:
----------------------------------------------------
   @property auto foo() inout nothrow pure @safe {
      inout(S)[] tmp;
      foreach(e; arr)
         tmp ~= e.fun(this);
      return tmp;
   }
----------------------------------------------------


Of course, the functional style looks cleaner, neater, and more immediately obvious what is being done.

So, is this a limitation with inout, part of its design, or am I misunderstaning something more fundamental?


[0] https://d.puremagic.com/issues/show_bug.cgi?id=12408#c4

Reply via email to