3 回答
TA贡献1942条经验 获得超3个赞
您可以轻松地使用TryInto特征(在Rust 1.34中已稳定):
fn pop(barry: &[u8]) -> [u8; 3] {
barry.try_into().expect("slice with incorrect length")
}
但更好的是:无需克隆/复制元素!实际上有可能从中获得&[u8; 3]a &[u8]:
fn pop(barry: &[u8]) -> &[u8; 3] {
barry.try_into().expect("slice with incorrect length")
}
如其他答案中所述,如果的长度barry不为3,您可能不希望惊慌,而应适当地处理此错误。
这要归功于$N相关特征的这些impls(其中仅是1到32之间的整数)TryFrom:
impl<'a, T> TryFrom<&'a [T]> for &'a [T; $N]
type Error = TryFromSliceError;
impl<'a, T: Copy> TryFrom<&'a [T]> for [T; $N]
type Error = TryFromSliceError;
TA贡献1831条经验 获得超10个赞
我们可以使用此辅助函数:
use std::convert::AsMut;
fn clone_into_array<A, T>(slice: &[T]) -> A
where
A: Default + AsMut<[T]>,
T: Clone,
{
let mut a = A::default();
<A as AsMut<[T]>>::as_mut(&mut a).clone_from_slice(slice);
a
}
得到更整洁的语法:
fn main() {
let original = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let e = Example {
a: clone_into_array(&original[0..4]),
b: clone_into_array(&original[4..10]),
};
println!("{:?}", e);
}
只要T: Default + Clone。
如果您知道您的类型实现Copy,则可以使用以下形式:
use std::convert::AsMut;
fn copy_into_array<A, T>(slice: &[T]) -> A
where
A: Default + AsMut<[T]>,
T: Copy,
{
let mut a = A::default();
<A as AsMut<[T]>>::as_mut(&mut a).copy_from_slice(slice);
a
}
panic!如果目标数组和传入的切片的长度不相同,则这两种变体都将。
TA贡献1936条经验 获得超6个赞
这是一个与您要求的类型签名相匹配的函数。
fn pop(barry: &[u8]) -> [u8; 3] {
[barry[0], barry[1], barry[2]]
}
但是由于barry可能少于三个元素,因此您可能需要返回一个Option<[u8; 3]>而不是一个[u8; 3]。
fn pop(barry: &[u8]) -> Option<[u8; 3]> {
if barry.len() < 3 {
None
} else {
Some([barry[0], barry[1], barry[2]])
}
}
- 3 回答
- 0 关注
- 1349 浏览
添加回答
举报