On 17.11.2015 20:46, maik klein wrote:
.selectFromTuple!(0, 1).expand

Does this result in a copy? I avoided doing it like this because I was
worried that I would copy every array. But I also don't fully understand
when D will copy.

Yes and no. It copies the Array structs, but it does not copy the elements of the arrays. If I remember correctly, std.container.Array uses reference counting, and copying them should be cheap.

By the way, do you have a good reason to go with Array!int rather than int[]? They're similar, but the builtin int[] may be easier to handle.

Also doing

   foreach(e;range){
     e[0] = 10;
     e[1] = 10.0f;
     writeln("element: ",e);
   }
   foreach(e;range){
     writeln("element: ",e);
   }

doesn't mutate the range at all.

You need to mark the `e` as `ref`: `foreach(ref e; range)`. Otherwise, it's a copy of the element, and any changes to it are forgotten at the end of the iteration.

But even with `ref` it doesn't work. Seems to be a bug in or a limitation of `zip`. Works with `lockstep`:
----
  auto ranges = integrals
    .selectFromTuple!(0, 1).expand
    .mapTuple!(a => a[]).expand;
  auto range = ranges.zip;

  import std.range: lockstep;
  foreach(ref e0, ref e1; lockstep(ranges)){
    e0 = 10;
    e1 = 10.0f;
  }
  foreach(e;range){
    writeln("element: ",e);
  }
----

Reply via email to