【发布时间】:2019-08-30 03:59:30
【问题描述】:
这个问题是关于如何阅读 Rust 文档并提高我对 Rust 的理解,从而了解如何解决这个特定的编译器错误。
我已经阅读了tokio docs 并尝试了许多examples。在编写自己的代码时,我经常遇到我不理解的编译器错误,并且经常发现我可以修复代码,但不明白为什么需要特定的语法。
我根据tokio的hello world复制了一个非常简单的例子:
use futures::Future;
use tokio::net::TcpStream;
use tokio::prelude::*;
fn main() {
let addr = "127.0.0.1:6142".parse().unwrap();
let client = TcpStream::connect(&addr).and_then(|stream| {
println!("created stream");
// Process stream here.
// Ok(())
});
}
以上代码不正确,需要注释掉Ok()。我知道这是真的,但不完全是为什么。这可能是先前问题How do I interpret the signature of read_until and what is AsyncRead + BufRead in Tokio? 的另一半——现在我对闭包有了更好的理解,但无法完全解析文档以了解预期的返回值。
当我尝试编译上面的错误代码时,我收到以下错误:
error[E0277]: the trait bound `(): futures::future::Future` is not satisfied
--> tokio-chat-client/src/main.rs:8:42
|
8 | let client = TcpStream::connect(&addr).and_then(|stream| {
| ^^^^^^^^ the trait `futures::future::Future` is not implemented for `()`
|
= note: required because of the requirements on the impl of `futures::future::IntoFuture` for `()`
我的问题分为两部分:
- 试图告诉我的错误消息是什么?
- 如何使用and_then 的文档来了解预期的返回值?
【问题讨论】:
-
我在
Stream对象上遇到了与for_each()类似的问题。阅读回复后,我可以通过在传入的闭包结束时返回futures_util::future::ready(())来修复它。
标签: rust rust-tokio