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

时间:2015-04-05 21:39:25

标签: generics rust where-clause

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

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说这样会很好一旦。什么是正确的方法?

1 个答案:

答案 0 :(得分: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)
}