簡體   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