Rust 为什么我需要定义一个trait来定义外部类型的实现?
Rust 为什么我需要定义一个trait来定义外部类型的实现?,rust,Rust,std::iter库有一个只有一个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:
std::iter
库有一个只有一个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)
}
}
有没有一种方法可以让两者兼得呢?我可以写sum
以便:
- 我可以使用
语法;及foo.iter().sum()
- 我不必复制
类型签名fn sum(&mut self)->A
迭代器不是一种类型,它实际上是一种特性。如果它是一种类型,那么这是可能的,类似于:
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迭代器{
fn和(&mut self)->A{
设零:A=零::零();
自折叠(零,| 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)
}
}
impl T{
fn和(&mut self)->A{
设零:A=零::零();
自折叠(零,| s,x | s+x)
}
}
但是编译器不喜欢这样,它迫使我们定义一个新的特性。UFCS,当它出现时,将对此有很大帮助。为什么Rust编译器不允许您描述的第二种形式?我不确定。我认为这可能与它如何跟踪方法实现有关。
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)
}
}