如何克隆长度大于 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
可以在 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 areT: Clone