这个问题是关于如何阅读Rust文档并提高对Rust的理解,以便了解如何解决特定的编译器错误。
我已经阅读了tokio文档并尝试了许多示例。在编写自己的代码时,我经常遇到我不理解的编译器错误,并且经常发现我可以修复代码,但不理解为什么需要特定的语法。
我根据tokio的hello world制作了一个非常简单的示例来重现该错误:
上面的代码是不正确的,需要使用已注释掉的
当我尝试编译上面的错误代码时,会出现以下错误:
我已经阅读了tokio文档并尝试了许多示例。在编写自己的代码时,我经常遇到我不理解的编译器错误,并且经常发现我可以修复代码,但不理解为什么需要特定的语法。
我根据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()
。我知道这是对的,但不知道为什么。这可能是先前问题如何解释read_until的签名以及Tokio中AsyncRead + BufRead是什么?的另一半——现在我更好地理解了闭包,但无法解析文档以了解预期的返回值。当我尝试编译上面的错误代码时,会出现以下错误:
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(())
来解决它。 - MKroehnert