【发布时间】:2019-06-22 23:51:38
【问题描述】:
我不知道如何提供一个Stream await 异步函数来获取流值所需的数据。
我尝试直接实现 Stream 特征,但我遇到了问题,因为我想使用像 awaiting 这样的异步东西,编译器不希望我调用异步函数。
我认为我缺少一些关于 Stream 目标的背景知识,我只是错误地攻击了这一点,也许我根本不应该看 Stream,但我不知道还有哪里可以转。我见过其他可能有用的functions in the stream module,但我不确定如何存储任何状态并使用这些功能。
作为我实际目标的略微简化版本,我想提供来自 AsyncRead 对象(即 TCP 流)的 64 字节 Vecs 流,但还要在任何逻辑结束时存储一些状态为流生成值,在本例中为计数器。
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"
【问题讨论】:
标签: rust async-await stream