克隆多维数组

问题描述 投票:0回答:2

我想将多维数组@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. Why array @a is binded to array @b (What is the purpose of the clone method in this situation? We know that clone behave as intented for one-dimensional arrays)

2. 
    2.1 How can I really clone @a to @b (multidimensional)?
    2.2 Which is the most efficient way (time bounded) to do that?
arrays clone perl6 raku
2个回答
1
投票

您拥有的不是多维数组,而是数组的数组。由于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]]

作为最后的清理,您还可以将概念上无限的0序列“倒入”数组中以对其进行初始化:

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

这意味着不需要在右侧复制3x3结构。


0
投票

@a@b不是bound。它们恰好包含相同的东西。 clone不递归,仅克隆外部Array。

实现您想要的目标的一种方法是

@b = @a.map: *.clone; 
© www.soinside.com 2019 - 2024. All rights reserved.