我正在尝试编写一个函数,该函数并发处理期货集合,并在它们变得可用后返回values
和errors
。
不幸的是,我不能征服这里的语法。这就是我在的地方:
async fn handle_futures<I, T, E>(futures: I) -> (Vec<T>, Vec<E>) where I: IntoIterator<Item = impl Future<Output = Result<T, E>>>, { // <- this line errors
let mut futures = FuturesUnordered::from_iter(futures);
let (mut successes, mut errors) = (vec![], vec![]);
while let Some(result) = futures.next().await {
match result {
Ok(value) => successes.push(value),
Err(error) => errors.push(error),
}
}
(successes, errors)
}
字符串
我现在看到这个错误:impl Trait
只允许在函数和固有方法返回类型中使用,不允许在绑定中使用
有人能帮我找到一个有效的实现吗?
**编辑:**我认为这是一个技巧:
async fn handle_futures<I, T, E, P>(futures: I) -> (Vec<T>, Vec<E>)
where
P: Future<Output = Result<T, E>>,
I: IntoIterator<Item = P>,
{
let mut futures = FuturesUnordered::from_iter(futures);
let (mut successes, mut errors) = (vec![], vec![]);
while let Some(result) = futures.next().await {
match result {
Ok(value) => successes.push(value),
Err(error) => errors.push(error),
}
}
(successes, errors)
}
型
2条答案
按热度按时间0tdrvxhp1#
不要使用匿名类型参数(也称为
impl Trait
in argument position)语法,因为不支持将它们嵌套在trait边界内。请为将来的类型使用普通的旧泛型类型参数:字符串
Playground.
qxgroojn2#
您需要为将来引入另一个泛型参数:
字符串
或者,如果愿意,可以直接约束
I::Item
:型