我有一个未知大小的数组,我想从该数组中获取一个片段,并将其转换为静态大小的数组:

fn pop(barry: &[u8]) -> [u8; 3] {
    barry[0..3] // expected array `[u8; 3]`, found slice `[u8]`
}

我该怎么做?

推荐答案

你可以很容易地用TryIntotrait (稳定在Rust 1.34中)做到这一点:

use std::convert::TryInto;

fn pop(barry: &[u8]) -> [u8; 3] {
    barry.try_into().expect("slice with incorrect length")
}

但更好的是:没有必要克隆/复制你的元素!实际上,从&[u8]中获得&[u8; 3]分是可能的:

fn pop(barry: &[u8]) -> &[u8; 3] {
    barry.try_into().expect("slice with incorrect length")
}

正如其他答案中提到的,如果barry的长度不是3,你可能不想惊慌失措,而是要优雅地处理这个错误.

这得益于相关性状TryFrom的这些impl(在Rust 1.47之前,这些仅存在于长度不超过32的数组中):

impl<'_, T, const N: usize> TryFrom<&'_ [T]> for [T; N]
where
    T: Copy, 

impl<'a, T, const N: usize> TryFrom<&'a [T]> for &'a [T; N]

impl<'a, T, const N: usize> TryFrom<&'a mut [T]> for &'a mut [T; N]

Rust相关问答推荐

将此字符串转换为由空格字符分隔的空格

如何仅使用http机箱发送http请求?

这种获取-释放关系是如何运作的?

关于如何初始化弱 struct 字段的语法问题

为昂贵的for循环制作筛子

如何go 除多余的(0..)在迭代中,当它不被使用时?

在Rust 中移动原始指针的靶子安全吗

正在将带有盒的异步特征迁移到新的异步_fn_in_特征功能

使用 serde::from_value 反序列化为泛型类型

为什么 Rust 需要可变引用的显式生命周期而不是常规引用?

Nom 解析器无法消耗无效输入

tokio::spawn 有和没有异步块

如何保存指向持有引用数据的指针?

Rust 程序中的内存泄漏

如何在 Rust 中将枚举变体转换为 u8?

&self 参数在 trait 的功能中是必需的吗?

不能将 `*self` borrow 为不可变的,因为它也被borrow 为可变的 - 编译器真的需要如此严格吗?

如何将 Rust 中的树状 struct 展平为 Vec<&mut ...>?

如何在 Rust 中创建最后一个元素是可变长度数组的 struct ?

TcpStream::connect - 匹配武器具有不兼容的类型