Чтобы скомпилировать приведенный ниже код, я должен указать тип вывода операции Add. Однако очень похожий код, использующий операцию Mul, не требует этой спецификации. Почему здесь есть разница между операциями Add и Mul?
trait IdentityExt {
fn identity(self) -> Self;
}
impl<T> IdentityExt for T where T: std::ops::Mul, T: num::One {
fn identity(self) -> T {
self * T::one()
}
}
trait IncrementExt {
fn increment(self) -> Self;
}
//impl<T> IncrementExt for T where T: std::ops::Add, T: num::One { // Doesn't compile
impl<T> IncrementExt for T where T: std::ops::Add<Output = T>, T: num::One {
fn increment(self) -> T {
self + T::one()
}
}
fn main() {
let x = 13;
println!("{:?}", x.increment());
println!("{:?}", x.identity());
}
Playground link