gpt4 book ai didi

rust - 如何解释 read_until 的签名以及 Tokio 中的 AsyncRead + BufRead 是什么?

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

我正在尝试理解 Rust 中的异步 I/O。以下代码基于 Katharina Fey 的片段 Jan 2019 talk这对我有用:

use futures::future::Future;
use std::io::BufReader;
use tokio::io::*;

fn main() {
let reader = BufReader::new(tokio::io::stdin());
let buffer = Vec::new();

println!("Type something:");
let fut = tokio::io::read_until(reader, b'\n', buffer)
.and_then(move |(stdin, buffer)| {
tokio::io::stdout()
.write_all(&buffer)
.map_err(|e| panic!(e))
})
.map_err(|e| panic!(e));

tokio::run(fut);
}

在找到该代码之前,我试图从 read_until 中找出它文档。

如何解释 read_until 的签名以在上面的代码示例中使用它?

pub fn read_until<A>(a: A, byte: u8, buf: Vec<u8>) -> ReadUntil<A> 
where
A: AsyncRead + BufRead,

具体来说,我如何通过阅读文档知道传递给 and_then 闭包的参数和预期结果是什么?

最佳答案

参数到and_then

不幸的是,Rust 文档的标准布局使得 futures 很难遵循。

read_until 开始您链接的文档,我可以看到它返回 ReadUntil<A> .我将单击它转到 ReadUntil documentation .

这个返回值描述为:

A future which can be used to easily read the contents of a stream into a vector until the delimiter is reached.

我希望它能实现 Future特质 - 我可以看到它确实如此。我还假设 Item future 解决的是某种向量,但我不知道到底是什么,所以我继续挖掘:

  1. 首先,我在“Trait implementations”下查看并找到 impl<A> Future for ReadUntil<A>
  2. 我点击 [+]扩张器

最后我看到了关联的type Item = (A, Vec<u8>) .这意味着它是 Future这将返回一对值:A , 所以它大概是把原来的 reader 还给我了我传入的,加上一个字节向量。

当 future 解析到这个元组时,我想用 and_then 附加一些额外的处理.这是 Future 的一部分trait,所以我可以进一步向下滚动以找到该函数。

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,

函数and_then被记录为采用两个参数,但是 self当使用点语法给 chain 函数时由编译器隐式传递,这告诉我们可以编写 read_until(A, '\n', buffer).and_then(...) .文档中的第二个参数,f: F , 成为传递给 and_then 的第一个参数在我们的代码中。

我可以看到 f是一个闭包,因为类型 F显示为FnOnce(Self::Item) -> B (如果我点击指向 Rust book closure chapter 的链接。

闭包f传入的需要 Self::Item作为参数。我刚发现 Item(A, Vec<u8>) , 所以我希望写类似 .and_then(|(reader, buffer)| { /* ... /* }) 的东西

AsyncRead + BufRead

这限制了可以阅读的阅读器类型。创建的 BufReader 工具 BufRead .

有用的是,Tokio 提供了 an implementation of AsyncRead for BufReader 所以我们不必担心,我们可以继续使用 BufReader .

关于rust - 如何解释 read_until 的签名以及 Tokio 中的 AsyncRead + BufRead 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56402818/

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