Fir*_*ant 6 arrays vector rust
我有一些Vec不平凡的类型,其大小我确定。我需要将其转换为固定大小的数组。理想情况下我想这样做
Vec问题写成代码:
struct Point {
x: i32,
y: i32,
}
fn main() {
let points = vec![
Point { x: 1, y: 2 },
Point { x: 3, y: 4 },
Point { x: 5, y: 6 },
];
// I would like this to be an array of points
let array: [Point; 3] = ???;
}
Run Code Online (Sandbox Code Playgroud)
这似乎是一个微不足道的问题,但是我无法在Vec文档、Rust Books 的切片部分或通过谷歌搜索中找到令人满意的解决方案。我发现的唯一一件事是首先用零数据初始化数组,然后从 复制所有元素Vec,但这不能满足我的要求。
正确地做到这一点非常困难。问题在于当存在部分未初始化的数组时正确处理恐慌。如果数组内的类型实现了Drop,那么它将访问未初始化的内存,从而导致未定义的行为。
最简单、最安全的方法是使用arrayvec:
extern crate arrayvec;
use arrayvec::ArrayVec;
#[derive(Debug)]
struct Point {
x: i32,
y: i32,
}
fn main() {
let points = vec![
Point { x: 1, y: 2 },
Point { x: 3, y: 4 },
Point { x: 5, y: 6 },
];
let array: ArrayVec<_> = points.into_iter().collect();
let array: [Point; 3] = array.into_inner().unwrap();
println!("{:?}", array);
}
Run Code Online (Sandbox Code Playgroud)
请注意,这只适用于特定大小的数组,因为 Rust 还没有通用整数。into_inner还有一个您应该注意的性能警告。
也可以看看:
将向量转换为数组并返回,这无意中编写了无需副本即可工作的代码,但并未明确声明这是故意的
| 归档时间: |
|
| 查看次数: |
10945 次 |
| 最近记录: |