Следующий код ( ссылка на игровую площадку ) как модификация вашего текущего кода в вашем вопросе дает желаемый результат:
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: Result<Vec<String>, ParseIntError> = into_many(10)
.map(|number| convert_to_string(number))
.collect()
.wait()
.unwrap()
.into_iter()
.collect();
println!("vec={:#?}", vec);
println!("finish:");
}
Поскольку ваш текущий код вернул Vec
мы можем превратить это в итератор и собрать в нужный вам тип.Аннотации типов необходимы, чтобы сборщик знал, в какой тип собирать итератор.
Обратите внимание, что метод collect
в признаке Iterator
не следует путать с методом collect
в Stream
.
Наконец, хотя это работает, это может быть не совсем то, что вам нужно, поскольку он все еще ожидает сбора всех результатов из потока в вектор, за до с использованием команды collect.преобразовать вектор.У меня нет опыта работы с фьючерсами, поэтому я не уверен, насколько это возможно (возможно, но может потребоваться менее аккуратное решение в стиле функционального программирования).