繁体   English   中英

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

[英]Why do I need to define a trait to define an implementation on an external type?

std::iter库具有AdditiveIter特性 ,该特性仅具有一个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类型签名?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM