有没有一种好的方法将大小为S的Vec转换为类型为[T; S]的数组?具体来说,我正在使用一个返回128位哈希作为Vec的函数,它将始终具有长度16,并且我想将哈希处理为[u8, 16]。
是否有类似于as_slice方法的内置功能可以给我想要的结果,或者我应该编写自己的函数,分配固定大小的数组,迭代通过复制每个元素的向量,并返回数组?
是否有类似于as_slice方法的内置功能可以给我想要的结果,或者我应该编写自己的函数,分配固定大小的数组,迭代通过复制每个元素的向量,并返回数组?
数组必须完全初始化,因此当您将具有太多或太少元素的向量转换为数组时,您会迅速遇到问题。这些示例会简单地引发恐慌。
从 Rust 1.51开始,您可以根据数组的长度进行参数化。
use std::convert::TryInto;
fn demo<T, const N: usize>(v: Vec<T>) -> [T; N] {
v.try_into()
.unwrap_or_else(|v: Vec<T>| panic!("Expected a Vec of length {} but it was {}", N, v.len()))
}
use std::convert::TryInto;
fn demo<T>(v: Vec<T>) -> [T; 4] {
v.try_into()
.unwrap_or_else(|v: Vec<T>| panic!("Expected a Vec of length {} but it was {}", 4, v.len()))
}
use std::convert::TryInto;
fn demo<T>(v: Vec<T>) -> [T; 4] {
let boxed_slice = v.into_boxed_slice();
let boxed_array: Box<[T; 4]> = match boxed_slice.try_into() {
Ok(ba) => ba,
Err(o) => panic!("Expected a Vec of length {} but it was {}", 4, o.len()),
};
*boxed_array
}
另请参阅:
as_chunks
方法可以完成这个技巧。写下这段话时,它还处于试验阶段。 - Anssi