async_stream Stream Types



考虑以下最小流示例:

use futures::StreamExt;
use async_stream::stream;
#[tokio::main]
async fn main() {
let ticks = stream! {
yield Ok(0);
yield Err("");
};
futures::pin_mut!(ticks);
while let Some(x) = ticks.next().await {
println!("{:?}", x);
}
}

ticks的正确类型是什么?

这个出奇简单的问题阻止了我创建函数。正确的类型应该与函数签名一起使用。

use futures::StreamExt;
use async_stream::stream;
fn query() -> ???? {
return stream! {
yield Ok(0);
yield Err("");
};
}
#[tokio::main]
async fn main() {
let ticks = query();
futures::pin_mut!(ticks);
while let Some(x) = ticks.next().await {
println!("{:?}", x);
}
}

你如何找出类型?

实际类型是async_stream::AsyncStream<Result<i32, &'static str>, [some_compiler_generated_future_type]>,但是您不应该指定它,原因有两个:

  1. 不能指定,因为不能命名[some_compiler_generated_future_type]
  2. 即使你回避了这个问题(例如使用impl Trait),AsyncStreamasync_stream的文档中也没有提到,因为它被标记为#[doc(hidden)]-这是一个强烈的信号,库的作者认为它是一个可能会改变的实现细节,并希望你不要依赖它。

库文档没有提到如何做到这一点,这是非常不幸的,但是考虑到我们想要返回"一些流",我们可以使用impl Stream<Item = YieldType>表示它。你不能在局部变量声明中这样做(目前),但你可以在函数返回类型位置:

fn query() -> impl futures::Stream<Item = Result<i32, &'static str>>

相关内容

  • 没有找到相关文章

最新更新