On Wednesday, 11 July 2018 at 12:55:35 UTC, Timoses wrote:
On Tuesday, 10 July 2018 at 18:01:59 UTC, Steven Schveighoffer
wrote:
You are overthinking :) inout typically is much easier than
you expect, until you need to create temporary structs or
types with inout members, then it becomes problematic.
https://run.dlang.io/is/kosYuC
I had to put in a static if, because your function doesn't
work once you get down to the array type. See the // fixme
comment.
Ok, well that helped a tiny bit for the example.
I'm trying to reproduce the errors from my project. It's
starting to get out of control : D. inout is on a rampage!
https://run.dlang.io/is/5TN7XX
I guess it's the same as for immutable initialization of
arrays. I can't seem to find a proper response to this one..
[...]
class TestA(T : T[])
{
Test!T[] arr;
// ERROR: Can't initialize inout variable in a
for loop...
this(inout(T[]) arr) inout
{
// 1: Nope
foreach (mem; arr)
this.arr ~= test(mem);
// 2: Nope
//Test!T[] a;
//foreach (mem; arr)
// a ~= test(mem);
import std.algorithm : map;
// 3: Nope
// this.arr = arr.map!((e) => test(e)).array;
}
}
[...]
I guess the problem here is focused around the problem that the
incoming type in the constructor is inout and that the
constructed object itself is inout.
I can't seem to find another way, I'm just blatantly casting
now...
class TestA(T : T[])
{
Test!T[] arr;
this(inout(T[]) arr) inout
{
import std.algorithm : map;
import std.range: array;
// should be okay to cast to const, won't change anything
auto ts = cast(const T[])arr;
// should be okay as well, as `test(t)` creates a new
object
this.arr = cast(inout(Test!T[]))(ts.map!(t =>
test(t)).array);
}
}
I also found `assumeUnique` in std.exception, or
std.experimental.allocator.makeArray. I'm not to sure how they
might be able to circumvent the casting though, since I need an
inout array of the objects...
Am I missing something or is `inout` simply not that well
"implemented" yet?