克隆多维数组

Cloning multidimensional arrays

我想将多维数组 @a 克隆到数组 @b

我采用了最直观的方法,得出了以下结论:

    my @a = [0, 0, 0], [0, 0, 0], [0, 0, 0];

    my @b = @a.clone;

    @a[0][1] = 1;
    @b[1][0] = 1;

    say '@a : ' ~ @a.gist;
    say '@b : ' ~ @b.gist;

打印出来的是:

    @a : [[0 1 0] [1 0 0] [0 0 0]]
    @b : [[0 1 0] [1 0 0] [0 0 0]]

也就是说@a和@b这两个数组绑定了?

问题:

  1. 为什么数组@a绑定到数组@b(克隆的目的是什么 这种情况下的方法?我们知道克隆的行为符合预期 一维数组)
  2. 我怎样才能真正将@a 克隆到@b(多维)?
  3. 哪种方法最有效(有时间限制)?

您拥有的不是多维数组,而是数组的数组。由于 clone 很浅,它只会复制顶级数组。在这种情况下,clone 也是多余的,因为对数组的赋值已经是一个复制操作。

一个简单的修复方法是克隆每个嵌套数组:

my @b = @a.map(*.clone);

或者,您可以使用真正的多维数组。声明如下所示:

my @a[3;3] = [0, 0, 0], [0, 0, 0], [0, 0, 0];

然后复制到另一个数组将是:

my @b[3;3] = @a;

作业也需要更新以使用多维语法:

@a[0;1] = 1;
@b[1;0] = 1;

最后,结果是:

say '@a : ' ~ @a.gist;
say '@b : ' ~ @b.gist;

如愿:

@a : [[0 1 0] [0 0 0] [0 0 0]]
@b : [[0 0 0] [1 0 0] [0 0 0]]

作为最后的清理,您还可以 "pour" 一个概念上无限的 0 序列到数组中以对其进行初始化:

my @a[3;3] Z= 0 xx *;

也就是说右边的3x3结构不需要复制

@a@b 绑定 。它们只是碰巧包含相同的东西。 clone 不递归,只克隆外部数组。

一种实现您想要的方法是

@b = @a.map: *.clone;