fork download
  1. import std.stdio,
  2. std.range,
  3. std.traits,
  4. std.algorithm;
  5.  
  6. // static int idx; // 1, 2, 3, 4, 5, 6, 7 // OK
  7.  
  8. auto deepDup(A)(A arr)
  9. if (isArray!A)
  10. {
  11. static int idx; // 1, 1, 1, 2, 2, 3, 4 // Why is this happening?
  12. ++idx;
  13. writeln("visited");
  14. static if (isArray!(ElementType!A)) {
  15. writeln("ifIdx = ", idx);
  16. writeln("ifArr = ", arr);
  17. return arr.map!(a => a.deepDup).array;
  18.  
  19. } else {
  20. writeln("elseIdx = ", idx);
  21. writeln("elseArr = ", arr);
  22. return arr.dup;
  23. }
  24. }
  25.  
  26. void main() {
  27.  
  28. auto a = [[[1, 2, 3], [4, 5, 6, 7, 8]],
  29. [[9, 10], [11, 12, 13]]];
  30.  
  31. auto b = a.deepDup;
  32.  
  33. b[0][1][1 .. $ - 1] *= 3;
  34.  
  35. writeln("\nResualt: ");
  36.  
  37. writeln("a = ", a);
  38. // [[[1, 2, 3], [4, 5, 6, 7, 8]],
  39. // [[9, 10], [11, 12, 13]]]
  40. writeln("b = ", b);
  41. // [[[1, 2, 3], [4, 15, 18, 21, 8]],
  42. // [[9, 10], [11, 12, 13]]]
  43. }
Success #stdin #stdout 0s 4180KB
stdin
Standard input is empty
stdout
visited
ifIdx = 1
ifArr = [[[1, 2, 3], [4, 5, 6, 7, 8]], [[9, 10], [11, 12, 13]]]
visited
ifIdx = 1
ifArr = [[1, 2, 3], [4, 5, 6, 7, 8]]
visited
elseIdx = 1
elseArr = [1, 2, 3]
visited
elseIdx = 2
elseArr = [4, 5, 6, 7, 8]
visited
ifIdx = 2
ifArr = [[9, 10], [11, 12, 13]]
visited
elseIdx = 3
elseArr = [9, 10]
visited
elseIdx = 4
elseArr = [11, 12, 13]

Resualt: 
a = [[[1, 2, 3], [4, 5, 6, 7, 8]], [[9, 10], [11, 12, 13]]]
b = [[[1, 2, 3], [4, 15, 18, 21, 8]], [[9, 10], [11, 12, 13]]]