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條經驗 獲得超7個贊
這是一個與您要求的類型簽名相匹配的函數。
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 關注
- 1385 瀏覽
添加回答
舉報