亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在Rust中獲取切片作為數組?

如何在Rust中獲取切片作為數組?

明月笑刀無情 2019-11-19 10:27:42
我有一個未知大小的數組,我想獲取該數組的一部分并將其轉換為靜態大小的數組:fn pop(barry: &[u8]) -> [u8; 3] {    barry[0..3] // mismatched types: expected `[u8, ..3]` but found `&[u8]`}我該怎么做?
查看完整描述

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;


查看完整回答
反對 回復 2019-11-19
?
慕哥6287543

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!如果目標數組和傳入的切片的長度不相同,則這兩種變體都將。


查看完整回答
反對 回復 2019-11-19
?
LEATH

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]])

    }

}


查看完整回答
反對 回復 2019-11-19
  • 3 回答
  • 0 關注
  • 1385 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號