Почему std :: ops: Mul не требует ограничения на тип Output? - PullRequest
2 голосов
/ 07 февраля 2020

Чтобы скомпилировать приведенный ниже код, я должен указать тип вывода операции 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

1 Ответ

2 голосов
/ 07 февраля 2020

Потому что черта One уже делает это, pub trait One: Mul<Self, Output = Self>. Итак, вы можете просто написать impl<T> IdentityExt for T where T: num::One {.

Они добавляют его, потому что хотят, чтобы Один следовал:

a * 1 = a       ∀ a ∈ Self
1 * a = a       ∀ a ∈ Self
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...