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))),
}
}

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ù)雜了

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
。
添加回答
舉報(bào)