Должен ли я реализовать AddAssign для нового типа? - PullRequest
1 голос
/ 21 июня 2019

У меня новый тип:

struct NanoSecond(u64);

Я хочу реализовать дополнение для этого.(Я на самом деле использую derive_more, но вот MCVE.)

impl Add for NanoSecond {
    fn add(self, other: Self) -> Self {
        self.0 + other.0
    }
}

Но я должен реализовать AddAssign?Требуется ли это для работы?

let mut x: NanoSecond = 0.to();
let y: NanoSecond = 5.to();
x += y;

Приведет ли реализация этого к неожиданным эффектам?

1 Ответ

3 голосов
/ 21 июня 2019

Реализация AddAssign действительно необходима для работы оператора +=.

Решение о том, следует ли реализовать эту черту, будет в значительной степени зависеть от фактического типа и типа семантикичто вы стремитесь.Это относится к любому типу вашего собственного изготовления, включая новые типы.Наиболее важным из них является предсказуемость : реализация должна вести себя так, как ожидается от той же математической операции.В этом случае, учитывая, что сложение через Add уже хорошо определено для этого типа, и ничто не мешает вам реализовать эквивалентную операцию на месте, а затем добавить impl из AddAssign какэто самое предсказуемое.

impl AddAssign for NanoSecond {
    fn add_assign(&mut self, other: Self) {
        self.0 += other.0
    }
}

Можно также выбрать дополнительные реализации для ссылочных типов в качестве второго операнда (например, Add<&'a Self> и AddAssign<&'a Self>).

Обратите внимание, что в Clippy есть строки, которые проверяют правильность выполнения арифметической операции (suspicious_arithmetic_impl и suspicious_op_assign_impl).Как часть предсказуемости, черта должна вести себя почти так же, как и соответствующая математическая операция, независимо от того, был ли использован + или +=.Насколько мне известно, в настоящее время нет ни единого стандарта или руководства по API, предлагающего реализовать черты -Assign вместе с соответствующей операцией.

...