Why .dup not work with multidimensional arrays?
Dennis Ritchie via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Fri May 8 08:05:32 PDT 2015
On Friday, 8 May 2015 at 06:30:46 UTC, Ali Çehreli wrote:
> 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
Thank you. In D it's really easy :)
Recursion, which works with the lambda map looks fine.
I was a little question: why static int idx variable declared
within a function deepDup takes the values 1, 1, 1, 2, 2, 3, 4,
as opposed to a global variable static int idx, which receives
the expected value of 1, 2, 3, 4, 5, 6, 7 ?
-----
import std.stdio,
std.range,
std.traits,
std.algorithm;
// static int idx; // 1, 2, 3, 4, 5, 6, 7 // OK
auto deepDup(A)(A arr)
if (isArray!A)
{
static int idx; // 1, 1, 1, 2, 2, 3, 4 // Why is this happening?
++idx;
writeln("visited");
static if (isArray!(ElementType!A)) {
writeln("ifIdx = ", idx);
writeln("ifArr = ", arr);
return arr.map!(a => a.deepDup).array;
} else {
writeln("elseIdx = ", idx);
writeln("elseArr = ", arr);
return arr.dup;
}
}
void main() {
auto a = [[[1, 2, 3], [4, 5, 6, 7, 8]],
[[9, 10], [11, 12, 13]]];
auto b = a.deepDup;
b[0][1][1 .. $ - 1] *= 3;
writeln("\nResualt: ");
writeln("a = ", a);
// [[[1, 2, 3], [4, 5, 6, 7, 8]],
// [[9, 10], [11, 12, 13]]]
writeln("b = ", b);
// [[[1, 2, 3], [4, 15, 18, 21, 8]],
// [[9, 10], [11, 12, 13]]]
}
-----
http://ideone.com/mAHZyO
More information about the Digitalmars-d-learn
mailing list