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