为什么我需要定义特征来定义外部类型的实现?

时间:2014-08-30 17:54:49

标签: rust

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类型签名吗?

1 个答案:

答案 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)
  }
}

但编译器并不喜欢这样,并迫使我们定义一个新的特征。