3 回答

TA貢獻(xiàn)1942條經(jīng)驗(yàn) 獲得超3個(gè)贊
您可以輕松地使用TryInto特征(在Rust 1.34中已穩(wěn)定):
fn pop(barry: &[u8]) -> [u8; 3] {
barry.try_into().expect("slice with incorrect length")
}
但更好的是:無需克隆/復(fù)制元素!實(shí)際上有可能從中獲得&[u8; 3]a &[u8]:
fn pop(barry: &[u8]) -> &[u8; 3] {
barry.try_into().expect("slice with incorrect length")
}
如其他答案中所述,如果的長(zhǎng)度barry不為3,您可能不希望驚慌,而應(yīng)適當(dāng)?shù)靥幚泶隋e(cuò)誤。
這要?dú)w功于$N相關(guān)特征的這些impls(其中僅是1到32之間的整數(shù))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貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超10個(gè)贊
我們可以使用此輔助函數(shù):
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。
如果您知道您的類型實(shí)現(xiàn)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!如果目標(biāo)數(shù)組和傳入的切片的長(zhǎng)度不相同,則這兩種變體都將。

TA貢獻(xiàn)1936條經(jīng)驗(yàn) 獲得超7個(gè)贊
這是一個(gè)與您要求的類型簽名相匹配的函數(shù)。
fn pop(barry: &[u8]) -> [u8; 3] {
[barry[0], barry[1], barry[2]]
}
但是由于barry可能少于三個(gè)元素,因此您可能需要返回一個(gè)Option<[u8; 3]>而不是一個(gè)[u8; 3]。
fn pop(barry: &[u8]) -> Option<[u8; 3]> {
if barry.len() < 3 {
None
} else {
Some([barry[0], barry[1], barry[2]])
}
}
- 3 回答
- 0 關(guān)注
- 1383 瀏覽
添加回答
舉報(bào)