gpt4 book ai didi

rust - 理解错误 : trait `futures::future::Future` is not implemented for `()`

转载 作者:行者123 更新时间:2023-11-29 08:15:15 42 4
gpt4 key购买 nike

这个问题是关于如何阅读 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 `()`

我的问题分为两部分:

  1. 试图告诉我的错误消息是什么?
  2. 我将如何使用 and_then 的文档了解预期返回值?

最佳答案

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,

这意味着:

  • 您的闭包必须接受类型为 Self::Item 的参数并返回某种类型 B
  • 闭包返回的类型 B 必须可以转换为 future。
  • 如果那个 future 返回一个错误,那么这个错误的类型必须是 Self::Error

此外,如果您查看 IntoFuture 的文档, 你会看到它是 implemented for Result ,所以它适用于 Ok(()),但它没有为 () 实现,所以如果你的闭包什么都不返回,它就不起作用。

关于rust - 理解错误 : trait `futures::future::Future` is not implemented for `()` ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57720321/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com