我有一个未知大小的数组,我想从该数组中获取一个片段,并将其转换为静态大小的数组:
fn pop(barry: &[u8]) -> [u8; 3] {
barry[0..3] // expected array `[u8; 3]`, found slice `[u8]`
}
我该怎么做?
我有一个未知大小的数组,我想从该数组中获取一个片段,并将其转换为静态大小的数组:
fn pop(barry: &[u8]) -> [u8; 3] {
barry[0..3] // expected array `[u8; 3]`, found slice `[u8]`
}
我该怎么做?
你可以很容易地用TryInto
trait (稳定在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]