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

Lui*_*gro 10 arrays rust

固定长度的本机类型数组(或实现Copy特征的类型)可以在Rust中克隆到32的长度.也就是说,这会编译:

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

但这不是:

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

实际上,traitClone只为每个通用数组长度声明一个方法,从0到32.

什么是克隆长度的通用数组的有效和惯用的方法,比如33?

小智 7

您无法impl Clone在自己的代码中添加.这个问题将在某个时刻得到解决,同时您可以通过不同的努力来解决这个问题:

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


Oli*_*ier 5

从 Rust 1.21.0 开始,你可以克隆任意长度的数组。CHANGELOG的“库”部分说:

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