TL;DR: remove the semicolon after io::write_all
.
Review the definition of and_then
:
fn and_then<F, B>(self, f: F) -> AndThen<Self, B, F>
where
F: FnOnce(Self::Item) -> B,
B: IntoFuture<Error = Self::Error>,
Self: Sized,
The closure (F
) has to return some type (B
) that can be converted into a future (B: IntoFuture
) with an error type that matches the starting closure (Error = Self::Error
).
What does your closure return? ()
. Why is that? Because you've placed a semicolon (;
) at the end of your line. ()
does not implement the trait IntoFuture
, which is indicated by the error message part "on the impl of futures::IntoFuture
for ()
":
impl<F: Future> IntoFuture for F {
type Future = F;
type Item = F::Item;
type Error = F::Error;
}
Removing the semicolon will cause the Future
returned by io::write_all
to be returned back to and_then
and the program will compile.
In general, futures work by combining together smaller components which are themselves futures. All of this works together to build a single large future which is essentially a state machine. It's good to keep this in mind, as you will almost always need to return a future when using such combinators.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…