使用重复的关联类型限制简化where子句

问题描述 投票:2回答:1

我写了以下函数来总结一个迭代器:

use std::ops::Add;

fn sum_iter<I>(s: I, init: &I::Item) -> I::Item
where
    I: Iterator + Clone,
    <I as Iterator>::Item: Add<I::Item, Output = I::Item> + Copy,
{
    s.clone().fold(*init, |acc, item| acc + item)
}

使用Rust 1.0.0可以很好地编译,但是如果可以避免重复I::Item四次而是引用类型T并且在某处说Iterator::Item = T只有一次它会很好。这样做的正确方法是什么?

generics rust where-clause
1个回答
3
投票

您可以添加T作为函数的类型参数,并需要I来实现Iterator<Item = T>,如下所示:

fn sum_iter<I, T>(s: I, init: &T) -> T
where
    I: Iterator<Item = T> + Clone,
    T: Add<T, Output = T> + Copy,
{
    s.clone().fold(*init, |acc, item| acc + item)
}
© www.soinside.com 2019 - 2024. All rights reserved.