Either
реализует Future
только тогда, когда оба его потомка реализуют Future
и их типы выстраиваются в линию:
impl<A, B> Future for Either<A, B>
where
A: Future,
B: Future<Item = A::Item, Error = A::Error>,
Result
не не реализует Future
, поэтому размещение Result
непосредственно внутри Either
также не будет реализовывать Future
.
Черта IntoFuture
ортогональна Future
. Как указано в документации:
Эта черта очень похожа на черту IntoIterator
и предназначена для очень похожего использования.
Вы не можете вызвать Iterator::map
на Vec
(vec![1, 2, 3].map(...)
), даже если Vec
реализует IntoIterator
, и та же логика применима к Result
/ Future
/ IntoFuture
.
Большую часть времени вы захотите использовать futures::ok
:
extern crate futures; // 0.1.25
use futures::{
future::{self, Either},
prelude::*,
sync::mpsc,
};
fn example() -> impl Future<Item = (), Error = ()> {
let (tx, _) = mpsc::channel(0);
let data = Some(1);
match data {
Some(d) => Either::A(tx.send(d).map(|_| ()).map_err(|_| ())),
None => Either::B(future::ok(())),
}
}
Вы также можете позвонить into_future
напрямую:
Either::B(Ok(()).into_future())