У меня есть метод, который, в зависимости от предиката, вернется в будущем. Другими словами, выражение if-else, возвращающее будущее:
extern crate futures; // 0.1.23
use 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}, _>, [[email protected]/lib.rs:7:27: 7:32]>'
found type 'futures::AndThen<futures::FutureResult<{integer}, _>, futures::FutureResult<{integer}, _>, [[email protected]/lib.rs:9:33: 9:54]>'
Фьючерсы создаются по-разному и могут содержать замыкания, поэтому их типы не равны. В идеале, решение не будет использовать Box
es, так как остальная часть моей асинхронной логики не использует их.
Как нормальная логика if-else обычно выполняется?