[英]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.