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

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

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

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

我有一種方法,根據(jù)謂詞的不同,它會返回一個(gè)將來或另一個(gè)。換句話說,一個(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))    }}這不會編譯: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)槲业漠惒竭壿嫷钠溆嗖糠志皇褂盟鼈儭F谪浿械膇f-else邏輯通常如何完成?
查看完整描述

3 回答

?
白衣染霜花

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

Either

使用futures::future::Either沒有額外的堆分配:


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é))。這并不總是勝利。


裝箱特征對象

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é)合起來:


我要指出,有相當(dāng)大的情況下,中間地帶的解決方案B:Either(A, Box<B>)。這樣,您僅需在少數(shù)情況下為堆分配付費(fèi)B


請注意,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))),

    }

}


查看完整回答
反對 回復(fù) 2019-12-06
?
開滿天機(jī)

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

r我試圖說Either<Either<A, B>, C>可以寫成Either<Either<A, B>, Either<C, Empty<_, _>>>。但是現(xiàn)在我不確定是否會更好。兩種類型都同樣嵌套,但這似乎不是優(yōu)勢。我想我太復(fù)雜了

查看完整回答
反對 回復(fù) 2019-12-06
?
MMTTMM

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

我給出了3個(gè)(奇數(shù))和4個(gè)(偶數(shù))條件的示例:如果您有2個(gè)以上的條件(Either<A, Either<B, C>>Either<Either<A, B>, Either<C, D>>等)。我不明白你為什么用Empty。

查看完整回答
反對 回復(fù) 2019-12-06
  • 3 回答
  • 0 關(guān)注
  • 596 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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