std::iter
图书馆的AdditiveIter trait只有一个impl
:
pub trait AdditiveIterator<A> {
fn sum(&mut self) -> A;
}
impl<A: Add<A, A> + Zero, T: Iterator<A>> AdditiveIterator<A> for T {
fn sum(&mut self) -> A {
let zero: A = Zero::zero();
self.fold(zero, |s, x| s + x)
}
}
此特征存在,以便我们可以编写foo.iter().sum()
。如果我们对编写sum(foo.iter())
感到满意,那么上面的代码可以更简单地编写为:
fn sum<A: Add<A, A> + Zero, T: Iterator<A>>(iter: &mut T) -> A {
let zero: A = Zero::zero();
iter.fold(zero, |s, x| s + x)
}
有没有办法充分利用两者?我可以写sum
以便:
我可以使用foo.iter().sum()
语法;以及
我不必复制fn sum(&mut self) -> A
类型签名吗?
答案 0 :(得分:0)
Iterator
不是一种类型,它实际上是一种特质。如果它是一种类型,那么这将是可能的,例如:
impl<A: Add<A, A> + Zero> Iterator<A> {
fn sum(&mut self) -> A {
let zero: A = Zero::zero();
self.fold(zero, |s, x| s + x)
}
}
如果我们可以在泛型类型上实现方法,我们可以这样做:
impl<A: Add<A, A> + Zero, T: Iterator<A>> T {
fn sum(&mut self) -> A {
let zero: A = Zero::zero();
self.fold(zero, |s, x| s + x)
}
}
但编译器并不喜欢这样,并迫使我们定义一个新的特征。