有没有一种好的方法可以将 Vec < T > 转换为数组?

有没有一个好的方法来转换一个大小为 SVec<T>到一个类型为 [T; S]的数组?具体来说,我使用的函数返回一个128位的散列作为 Vec<u8>,它的长度总是16,我希望将散列作为 [u8, 16]处理。

是否存在类似于 as_slice方法的内置函数,它可以给我想要的东西,或者我应该编写自己的函数来分配一个固定大小的数组,在向量中迭代,复制每个元素,然后返回数组?

83383 次浏览

Arrays must be completely initialized, so you quickly run into concerns about what to do when you convert a vector with too many or too few elements into an array. These examples simply panic.

As of Rust 1.51 you can parameterize over an array's length.

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()))
}

As of Rust 1.48, each size needs to be a specialized implementation:

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()))
}

As of Rust 1.43:

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
}

See also: