有什么好的方法可以将 Vec<T> 转换为数组吗?
Is there a good way to convert a Vec<T> to an array?
有没有什么好的方法可以将大小为 S
的 Vec<T>
转换为 [T; S]
类型的数组?具体来说,我正在使用 returns 128 位散列作为 Vec<u8>
的函数,它的长度始终为 16,我想将散列作为 [u8, 16]
处理.
是否有类似于 as_slice
方法的内置方法可以提供我想要的东西,或者我应该编写自己的函数来分配一个固定大小的数组,遍历复制每个元素的向量,和 returns 数组?
数组必须完全初始化,因此您很快 运行 担心将元素过多或过少的向量转换为数组时该怎么做。这些例子简直是恐慌。
从 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()))
}
从 Rust 1.48 开始,每个尺寸都需要专门的实现:
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()))
}
从 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
}
另请参阅:
- How to get a slice as an array in Rust?
有没有什么好的方法可以将大小为 S
的 Vec<T>
转换为 [T; S]
类型的数组?具体来说,我正在使用 returns 128 位散列作为 Vec<u8>
的函数,它的长度始终为 16,我想将散列作为 [u8, 16]
处理.
是否有类似于 as_slice
方法的内置方法可以提供我想要的东西,或者我应该编写自己的函数来分配一个固定大小的数组,遍历复制每个元素的向量,和 returns 数组?
数组必须完全初始化,因此您很快 运行 担心将元素过多或过少的向量转换为数组时该怎么做。这些例子简直是恐慌。
从 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()))
}
从 Rust 1.48 开始,每个尺寸都需要专门的实现:
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()))
}
从 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
}
另请参阅:
- How to get a slice as an array in Rust?