On 05/07/2015 07:39 PM, Dennis Ritchie wrote:
On Friday, 8 May 2015 at 02:23:23 UTC, E.S. Quinn wrote:
It's because arrays are references types, and .dup is a strictly
shallow copy, so you're getting two outer arrays that reference
the same set of inner arrays. You'll have to duplicated each of
the inner arrays yourself if you need to make a deep copy.

Thank you. It really works :)

-----
import std.stdio;

void main() {

     auto c = [[[1, 2, 3], [4, 5, 6, 7, 8]],
           [[9, 10], [11, 12, 13]]];

     auto d = [[c[0][0].dup, c[0][1].dup],
           [c[1][0].dup, c[1][1].dup]];

     d[0][1][1 .. $ - 1] *= 3;

     writeln("c = ", c);
     // [[[1, 2, 3], [4, 5, 6, 7, 8]],
     //  [[9, 10], [11, 12, 13]]] // OK
     writeln("d = ", d);
     // [[[1, 2, 3], [4, 15, 18, 21, 8]],
     //  [[9, 10], [11, 12, 13]]] // OK
}
-----
http://ideone.com/kJVUhd

Maybe there is a way to create .globalDup for multidimensional arrays?

In D, everything is possible and very easy. :p I called it deepDup:

import std.stdio;
import std.traits;
import std.range;
import std.algorithm;

auto deepDup(A)(A arr)
    if (isArray!A)
{
    static if (isArray!(ElementType!A)) {
        return arr.map!(a => a.deepDup).array;

    } else {
        return arr.dup;
    }
}

void main()
{
    auto c = [[[1, 2, 3], [4, 5, 6, 7, 8]],
          [[9, 10], [11, 12, 13]]];

    auto d = c.deepDup;

    d[0][1][1 .. $ - 1] *= 3;

    writeln("c = ", c);
    // [[[1, 2, 3], [4, 5, 6, 7, 8]],
    //  [[9, 10], [11, 12, 13]]] // OK
    writeln("d = ", d);
    // [[[1, 2, 3], [4, 15, 18, 21, 8]],
    //  [[9, 10], [11, 12, 13]]] // OK
}

Ali

Reply via email to