我有以下一段代码(请参见playground):
use futures::{stream, Future, Stream}; // 0.1.25
use std::num::ParseIntError;
fn into_many(i: i32) -> impl Stream<Item = i32, Error = ParseIntError> {
stream::iter_ok(0..i)
}
fn convert_to_string(number: i32) -> Result<String, ParseIntError> {
Ok(number.to_string())
}
fn main() {
println!("start:");
let vec = into_many(10)
.map(|number| convert_to_string(number))
.collect()
.wait()
.unwrap();
println!("vec={:#?}", vec);
println!("finish:");
}
它输出以下内容(即
Vec<Result<i32, ParseIntError>>
):start:
vec=[
Ok(
"0"
),
Ok(
"1"
),
Ok(
"2"
), ...
有没有办法让它输出一个Vec<i32>
,如果发生任何错误,立即停止执行并从函数中返回(例如,像这个例子)?
注意:即使对于这个特定的示例没有意义,我也想使用use futures::Stream; // 0.1.25
。
into_iter()
就无法使用它。 - James LarkinTry
)?快速浏览一下,看起来你需要停止在map函数内使用?
,并查看collect是否可为你实现此功能(链接的文档中有一个类似于你所需的示例)。你不能只是复制粘贴其他解决方案;你需要理解你正在处理的类型并开发出适合自己的解决方案。 - user3089519Vec<Result<>>
。我认为collect()
可以用于Iterator
,但无法用于Stream
,而且我也不能使用into_iter()
。 - James Larkin?
,则会收到以下消息:= 注意:期望类型为 `std::vec::Vec<i64>`,但发现类型为 `std::vec::Vec<std::result::Result<i64, errors::CustomError>>
- James Larkin