如何在Rust中获得一个数组?

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

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

我将如何做到这一点?

这是一个符合您要求的types签名的函数。

 fn pop(barry: &[u8]) -> [u8; 3] { [barry[0], barry[1], barry[2]] } 

但是由于barry可能less于三个元素,您可能想要返回一个Option<[u8; 3]> Option<[u8; 3]>而不是[u8; 3] [u8; 3]

 fn pop(barry: &[u8]) -> Option<[u8; 3]> { if barry.len() < 3 { None } else { Some([barry[0], barry[1], barry[2]]) } } 

感谢@malbarbo,我们可以使用这个辅助函数:

 use std::convert::AsMut; fn clone_into_array<A, T>(slice: &[T]) -> A where A: Sized + Default + AsMut<[T]>, T: Clone { let mut a = Default::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

它会panic! 如果目标数组和传入的片不具有相同的长度,因为clone_from_slice执行此操作。

您可以手动创build数组并将其返回。

这是一个函数,如果你想获得更多(或更less)3个元素,可以轻松扩展。

请注意,如果切片太小,数组的结束项将为0。

 fn pop(barry: &[u8]) -> [u8; 3] { let mut array = [0u8; 3]; for (&x, p) in barry.iter().zip(array.iter_mut()) { *p = x; } array } 

我推荐使用箱子arrayref ,它有一个方便的macros来做这个。

请注意,使用这个箱子,你创build一个数组的引用, &[u8; 3] &[u8; 3] ,因为它不克隆任何数据!

如果你想克隆数据,那么你仍然可以使用这个macros,但是最后调用clone:

 #[macro_use] extern crate arrayref; fn pop(barry: &[u8]) -> &[u8; 3] { array_ref!(barry, 0, 3) } 

要么

 #[macro_use] extern crate arrayref; fn pop(barry: &[u8]) -> [u8; 3] { array_ref!(barry, 0, 3).clone() }