gpt4 book ai didi

rust - 在调用异步 fns 时创建值流?

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

我不知道如何提供 Stream我在 await 异步函数中获取流值所需的数据。

我已尝试实现 Stream trait 直接,但我遇到了问题,因为我想使用像 awaiting 这样的异步东西,编译器不希望我调用异步函数。

我假设我缺少一些关于 Stream 目标的背景知识,我只是在错误地攻击它,也许我不应该查看 Stream 完全没有,但我不知道还能去哪里。我见过另一个functions in the stream module这可能很有用,但我不确定如何存储任何状态并使用这些功能。

作为我实际目标的稍微简化的版本,我想从 AsyncRead 对象(即 TCP 流)提供一个 64 字节的 Vec 流,但是还在最终为流生成值的任何逻辑中存储一个小状态,在本例中是一个计数器。

pub struct Receiver<T>
where
T: AsyncRead + Unpin,
{
readme: T,
num: u64,
}

// ..code for a simple `new() -> Self` function..

impl<T> Stream for Receiver<T>
where
T: AsyncRead + Unpin,
{
type Item = Result<Vec<u8>, io::Error>;

fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
let mut buf: [u8; 64] = [0; 64];
match self.readme.read_exact(&mut buf).await {
Ok(()) => {
self.num += 1;
Poll::Ready(Some(Ok(buf.to_vec())))
}
Err(e) => Poll::Ready(Some(Err(e))),
}
}
}

构建失败,说

error[E0728]: `await` is only allowed inside `async` functions and blocks

我正在使用 rustc 1.36.0-nightly (d35181ad8 2019-05-20) 并且我的 Cargo.toml 如下所示:

[dependencies]
futures-preview = { version = "0.3.0-alpha.16", features = ["compat", "io-compat"] }
pin-utils = "0.1.0-alpha.4"

最佳答案

reddit post 复制/粘贴的答案按用户Matthias247 :

It's unfortunately not possible at the moment - Streams have to be implemented by hand and can not utilize async fn. Whether it's possible to change this in the future is unclear.

You can work around it by defining a different Stream trait which makes use of Futures like:

trait Stream<T> { 
type NextFuture: Future<Output=T>;

fn next(&mut self) -> Self::NextFuture;
}

This article and this futures-rs issue have more information around it.

关于rust - 在调用异步 fns 时创建值流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56719990/

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