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

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

有條件地迭代幾個(gè)可能的迭代器之一

有條件地迭代幾個(gè)可能的迭代器之一

紅顏莎娜 2019-10-04 14:17:14
我正在嘗試根據(jù)功能的Option輸入來(lái)切換行為。這個(gè)想法是基于給定Option是否存在進(jìn)行迭代。這是一個(gè)最小的(如果很愚蠢的)示例:use std::iter;fn main() {    let x: Option<i64> = None;    // Repeat x 5 times if present, otherwise count from 1 to 5    for i in match x {        None => 1..5,        Some(x) => iter::repeat(x).take(5),    } {        println!("{}", i);    }}我收到一個(gè)錯(cuò)誤:error[E0308]: match arms have incompatible types  --> src/main.rs:7:14   |7  |       for i in match x {   |  ______________^8  | |         None => 1..5,9  | |         Some(x) => iter::repeat(x).take(5),   | |                    ----------------------- match arm with an incompatible type10 | |     } {   | |_____^ expected struct `std::ops::Range`, found struct `std::iter::Take`   |   = note: expected type `std::ops::Range<{integer}>`              found type `std::iter::Take<std::iter::Repeat<i64>>`當(dāng)然,這完全有道理,但是我真的很想根據(jù)條件選擇迭代器,因?yàn)閒or循環(huán)中的代碼很簡(jiǎn)單,而復(fù)制粘貼所有這些只是為了更改迭代器選擇就相當(dāng)了丑陋且難以維護(hù)。我嘗試as Iterator<Item = i64>兩臂同時(shí)使用,但是這給我?guī)?lái)了有關(guān)未定型類型的錯(cuò)誤,因?yàn)樗且粋€(gè)特征對(duì)象。有一個(gè)簡(jiǎn)單的方法可以解決這個(gè)問(wèn)題嗎?我可以使用,.collect()因?yàn)樗鼈兎祷叵嗤念愋筒⒈闅v該向量。這是一個(gè)很好的快速解決方案,但對(duì)于大型列表而言似乎有點(diǎn)多余。
查看完整描述

3 回答

?
慕虎7371278

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超4個(gè)贊

的任一箱提供Either類型。如果兩個(gè)Either都是迭代器,則Either:也是


extern crate either;


use either::Either;

use std::iter;


fn main() {

    let x: Option<i64> = None;


    // Repeat x 5 times if present, otherwise count from 1 to 5

    let iter = match x {

        None => Either::Left(1..5),

        Some(x) => Either::Right(iter::repeat(x).take(5)),

    };


    for i in iter {

        println!("{}", i);

    }

}

像先前的答案一樣,這仍然會(huì)占用每種具體類型的堆??臻g。但是,您不需要為每個(gè)具體值使用單獨(dú)的變量。


也可以從函數(shù)返回此類型,這與trait對(duì)象引用不同。與盒裝特征對(duì)象相比,無(wú)論選擇哪種具體類型,它都將始終在堆棧上使用固定大小。


您還會(huì)在其他地方找到這種類型(或語(yǔ)義等效),例如 futures::Either


查看完整回答
反對(duì) 回復(fù) 2019-10-04
?
瀟湘沐

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超6個(gè)贊

您需要引用一個(gè)特征:


use std::iter;


fn main() {

    let mut a;

    let mut b;


    let x: Option<i64> = None;


    // Repeat x 5 times if present, otherwise count from 1 to 5

    let iter: &mut Iterator<Item = i64> = match x {

        None => {

            a = 1..5;

            &mut a

        }

        Some(x) => {

            b = iter::repeat(x).take(5);

            &mut b

        }

    };


    for i in iter {

        println!("{}", i);

    }

}

該解決方案的主要缺點(diǎn)是,您必須為每種具體類型分配堆??臻g。這也意味著每種類型的變量。一件好事是只需要初始化使用的類型。


相同的想法但需要堆分配的是使用裝箱的特征對(duì)象:


use std::iter;


fn main() {

    let x: Option<i64> = None;


    // Repeat x 5 times if present, otherwise count from 1 to 5

    let iter: Box<Iterator<Item = i64>> = match x {

        None => Box::new(1..5),

        Some(x) => Box::new(iter::repeat(x).take(5)),

    };


    for i in iter {

        println!("{}", i);

    }

}

當(dāng)您要從函數(shù)返回迭代器時(shí),這最有用。占用的堆??臻g是單個(gè)指針,并且只會(huì)分配所需的堆空間。


查看完整回答
反對(duì) 回復(fù) 2019-10-04
?
波斯汪

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個(gè)贊

就個(gè)人而言,Either我通常更喜歡創(chuàng)建一系列Option<Iterator>鏈接在一起的價(jià)值觀,而不是使用。像這樣:


操場(chǎng)


use std::iter;


fn main() {

    let x: Option<i64> = None;


    // Repeat x 5 times if present, otherwise count from 1 to 5

    for i in pick(x) {

        println!("{}", i);

    }

}


fn pick(opt_x: Option<i64>) -> impl Iterator<Item = i64> {

    let iter_a = if let None = opt_x {

        Some(1..5)  

    } else {

        None

    };


    let iter_b = if let Some(x) = opt_x {

        Some(iter::repeat(x).take(5))

    } else {

        None

    };


    iter_a.into_iter().flatten().chain(iter_b.into_iter().flatten())

}

與使用相比Either,它不那么明顯,但是它避免了使用其他板條箱,有時(shí)效果非常好。


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

添加回答

舉報(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)