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

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

我如何有條件地退回不同類型的期貨?

我如何有條件地退回不同類型的期貨?

牧羊人nacy 2020-02-01 17:09:36
我有一個(gè)方法,根據(jù)謂詞的不同,它會(huì)返回一個(gè)將來(lái)或另一個(gè)。換句話說(shuō),一個(gè)if-else表達(dá)式返回一個(gè)future:extern crate futures; // 0.1.23use futures::{future, Future};fn f() -> impl Future<Item = usize, Error = ()> {    if 1 > 0 {        future::ok(2).map(|x| x)    } else {        future::ok(10).and_then(|x| future::ok(x + 2))    }}這不會(huì)編譯:error[E0308]: if and else have incompatible types  --> src/lib.rs:6:5   |6  | /     if 1 > 0 {7  | |         future::ok(2).map(|x| x)8  | |     } else {9  | |         future::ok(10).and_then(|x| future::ok(x + 2))10 | |     }   | |_____^ expected struct `futures::Map`, found struct `futures::AndThen`   |   = note: expected type `futures::Map<futures::FutureResult<{integer}, _>, [closure@src/lib.rs:7:27: 7:32]>`              found type `futures::AndThen<futures::FutureResult<{integer}, _>, futures::FutureResult<{integer}, _>, [closure@src/lib.rs:9:33: 9:54]>`期貨的創(chuàng)建方式不同,可能包含閉包,因此它們的類型不相等。理想情況下,該解決方案不使用Boxes,因?yàn)槲业漠惒竭壿嫷钠溆嗖糠侄疾皇褂盟鼈?。期貨中的if-else邏輯通常如何完成?
查看完整描述

1 回答

?
藍(lán)山帝景

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

Either

使用futures::future::Either沒(méi)有額外的堆分配:


extern crate futures; // 0.1.23


use futures::{

    future::{self, Either},

    Future,

};


fn f() -> impl Future<Item = usize, Error = ()> {

    if 1 > 0 {

        Either::A(future::ok(2).map(|x| x))

    } else {

        Either::B(future::ok(10).and_then(|x| future::ok(x + 2)))

    }

}

但是,這需要固定的堆棧分配。如果A占用1個(gè)字節(jié)并在99%的時(shí)間內(nèi)發(fā)生,但B占用512個(gè)字節(jié),則您Either將始終占用512個(gè)字節(jié)(加上一些字節(jié))。這并不總是勝利。


裝箱特征對(duì)象

extern crate futures; // 0.1.23


use futures::{future, Future};


fn f() -> Box<Future<Item = usize, Error = ()>> {

    if 1 > 0 {

        Box::new(future::ok(2).map(|x| x))

    } else {

        Box::new(future::ok(10).and_then(|x| future::ok(x + 2)))

    }

}

正如Matthieu M.指出的那樣,可以將兩種解決方案結(jié)合起來(lái):


我會(huì)注意到對(duì)于大的情況有一個(gè)中間的解決方案B:Either(A, Box<B>)。這樣,您僅需在極少數(shù)情況下為堆分配付費(fèi)B


請(qǐng)注意,Either如果您有兩個(gè)以上的條件(Either<A, Either<B, C>>; Either<Either<A, B>, Either<C, D>>等),也可以堆疊s :


fn f(v: i32) -> impl Future<Item = i32, Error = ()> {

    use std::cmp::Ordering;

    match v.cmp(&0) {

        Ordering::Less => Either::A(future::ok(2).map(|x| -x)),

        Ordering::Equal => Either::B(Either::A(future::ok(0))),

        Ordering::Greater => Either::B(Either::B(future::ok(-2).map(|x| x * x))),

    }

}


查看完整回答
反對(duì) 回復(fù) 2020-02-01
  • 1 回答
  • 0 關(guān)注
  • 434 瀏覽
慕課專欄
更多

添加回答

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