考虑以下最小流示例:
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]>
,但是您不应该指定它,原因有两个:
-
不能指定,因为不能命名
[some_compiler_generated_future_type]
。 - 即使你回避了这个问题(例如使用
impl Trait
),AsyncStream
在async_stream
的文档中也没有提到,因为它被标记为#[doc(hidden)]
-这是一个强烈的信号,库的作者认为它是一个可能会改变的实现细节,并希望你不要依赖它。
库文档没有提到如何做到这一点,这是非常不幸的,但是考虑到我们想要返回"一些流",我们可以使用impl Stream<Item = YieldType>
表示它。你不能在局部变量声明中这样做(目前),但你可以在函数返回类型位置:
fn query() -> impl futures::Stream<Item = Result<i32, &'static str>>