ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ### 组合器 Future 的实现往往遵循相同的模式。为了减少重复代码,`future`库提供了许多被称为 “组合器(Combinator)” 的工具,它们是这些模式的抽象,多以 \[`Future`\] 特质相关的函数的形式存在。 ### map [`map`](https://docs.rs/futures/0.1/futures/future/trait.Future.html#method.map)组合器拥有一个 future 并返回一个新 future,新 future 的值是通过前一个 future 调用某个给定的函数获得的。 之前的`Display`: ``` impl<T> Future for Display<T> where T: Future, T::Item: fmt::Display, { type Item = (); type Error = T::Error; fn poll(&mut self) -> Poll<(), T::Error> { let value = try_ready!(self.0.poll()); println!("{}", value); Ok(Async::Ready(())) } } fn main() { let future = Display(HelloWorld); tokio::run(future); } ``` 用`map`组合器实现HelloWorld: ``` extern crate tokio; extern crate futures; use futures::Future; fn main() { let future = HelloWorld.map(|value| { println!("{}", value); }); tokio::run(future); } ``` `map`的实现: ``` pub struct Map<A, F> where A: Future { future: A, f: Option<F>, } impl<U, A, F> Future for Map<A, F> where A: Future, F: FnOnce(A::Item) -> U, { type Item = U; type Error = A::Error; fn poll(&mut self) -> Poll<U, A::Error> { let value = try_ready!(self.future.poll()); let f = self.f.take().expect("cannot poll Map twice"); Ok(Async::Ready(f(value))) } } ``` ### `and_then` `and_then`组合器允许我们将两个异步操作连接起来。在第一个操作完成时,其值将被传递到一个函数中。该函数会使用该值创建一个新的 future 并使其运行。 `and_then`和`map`的区别是`and_then`的函数返回一个 future,而`map`的函数返回一个值。 ``` extern crate tokio; extern crate bytes; extern crate futures; use tokio::io; use tokio::net::TcpStream; use futures::Future; fn main() { let addr = "127.0.0.1:7878".parse().unwrap(); let connection = TcpStream::connect(&addr).and_then(|socket|{ io::write_all(socket, b"hello world"); }).map(|_| println!("write complete")) .map_err(|err| println!("failed")); } ```