如何复制数组以便从 Chapel 中的副本中删除元素?

How do I copy an array so I can remove elements from the copy in Chapel?

我正在处理一个数组的副本,因此我可以对其进行修改。样本是

var x:[1..4] int = [1,2,3,4];
writeln(x);
x.remove(3);
writeln(x);

var y = x;
writeln(y);
y.remove(2);
writeln(y);

然而,最后一行给了我

error: halt reached - cannot call remove on an array defined over a domain with multiple arrays

那么复制和允许编辑的正确方法是什么?

当你说:

var y = x;

您将获得一个新数组 y,其域(索引集)与 x 的相同。也就是说,这个声明类似于说:

var D = {1..4};      // create a domain
var x, y: [D] int;   // create two arrays that share that domain

如错误消息所示,Chapel 不允许直接调整与另一个数组共享其域的数组的大小,因为如果这样做,从 y 中删除元素也会导致从中删除该元素x 我们认为它过于微妙和令人惊讶,无法支持。

因此,为了创建可修改的 x 副本,您需要声明 y 以赋予它自己的独立域。针对您的特定程序执行此操作的最简单方法如下:

var y: [1..3] int = x;

你也可以写得更灵活一点:

var y: [1..x.size] int = x;

甚至:

var y: [1..x.size] x.eltType = x;

由于这些声明中的每一个都会导致 y 获得自己独特的域,因此可以独立于 x 对其进行修改。