第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何在Rust中獲取切片作為數(shù)組?

如何在Rust中獲取切片作為數(shù)組?

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

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;


查看完整回答
反對(duì) 回復(fù) 2019-11-19
?
慕哥6287543

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)度不相同,則這兩種變體都將。


查看完整回答
反對(duì) 回復(fù) 2019-11-19
?
LEATH

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

    }

}


查看完整回答
反對(duì) 回復(fù) 2019-11-19
  • 3 回答
  • 0 關(guān)注
  • 1383 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)