如何克隆长度大于32的数组?

13

在 Rust 中,一个本地类型(或实现了 Copy 特性的类型)的固定长度数组可以克隆,最大长度为32。也就是说,下面的代码可以编译通过:

fn main() {
    let source: [i32; 32] = [0; 32]; // length 32
    let _cloned = source.clone();
}

但这个不会:

fn main() {
    let source: [i32; 33] = [0; 33]; // length 33
    let _cloned = source.clone(); // <-- compile error
}

实际上,特质Clone仅为每个通用数组长度(从0到32)声明了一个方法。

如何高效且符合习惯的克隆一个长度为33的通用数组?


在这种情况下,您不能使用Vec的原因是什么? - Shepmaster
3
对于其他人可能会感到困惑的,这里是实现代码 - remram
2个回答

7
自从Rust 1.21.0版本以来,你可以克隆任意长度的数组。在CHANGELOG的“Libraries”部分中说到:

为所有数组和元组生成内置的实现T:CloneClone


7
您无法在自己的代码中添加impl Clone。这个问题将在某个时候得到解决,与此同时,您可以通过不同程度的努力来解决大部分问题:
  • 如果您只有一个具体类型的局部变量,并且该类型为Copy(就像您的示例一样),那么您可以简单地进行复制而不是克隆,即let _cloned = source;
  • 如果数组是您想要实现Clone的结构体的字段(并且derive无法工作),您仍然可以手动实现Clone并在实现中使用上述技巧。
  • 克隆非Copy类型的数组更加棘手,因为Clone可能会失败。您可以编写[x[0].clone(), x[1].clone(), ...],需要多少次就写多少次,这是很费力的,但至少是正确的。
  • 如果所有其他方法都失败了,您仍然可以创建一个新类型包装器。这需要相当多的样板文件来委托您需要的所有其他特性,但然后您可以(再次手动)实现Clone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接