如何在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() }