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

How to clone an array with length bigger than 32?

可以在 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
}

事实上,trait Clone只为每个通用数组长度声明了一个方法,从0到32。

克隆长度为 33 的通用数组的有效且惯用的方法是什么?

您不能在自己的代码中添加 impl Clone。这个问题会在某个时候得到解决,同时你可以通过不同的努力来解决它:

  • 如果你只有一个具体类型的局部变量并且类型是 Copy (如你的例子),你可以简单地 copy 而不是 克隆,即let _cloned = source;.
  • 如果数组是您要为其实现 Clone 的结构的字段(并且 derive 将不起作用),您仍然可以手动实现 Clone 并使用以上技巧在实现中。
  • 克隆非 Copy 类型的数组比较棘手,因为 Clone 可能会失败。 [x[0].clone(), x[1].clone(), ...] 写多少遍都可以,工作量很大,但至少它肯定是正确的。
  • 如果一切都失败了,您仍然可以创建一个新类型的包装器。这需要相当多的样板来委托您需要的所有其他特征,但是您可以(再次手动)实现 Clone.

自 Rust 1.21.0 起,您可以克隆任意长度的数组。 CHANGELOG 的 "Libraries" 部分说:

Generate builtin impls for Clone for all arrays and tuples that are T: Clone