有什么好的方法可以将 Vec<T> 转换为数组吗?

Is there a good way to convert a Vec<T> to an array?

有没有什么好的方法可以将大小为 SVec<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?