Есть ли тонкость в черте PartialEq
, которую я пропускаю? Методы
PartialEq
принимают self
и other
по ссылке (&self
и other: &T
в подписи), в то время как Neg
, Add
, Sub
и др. c. возьмите self
и (для бинарных операторов) other
по значению (self
и other: T
в подписи). v1 == v2
десугары в PartialEq::eq(&v1, &v2)
, в то время как !v1
десугары в Neg::neg(v1)
.
Причина, по которой вы можете захотеть Neg
стать владельцем переданного значения, заключается в том, что значение выделено динамически c память (через Box
, Vec
, et c.). В этом случае может быть более эффективно мутировать self
и затем возвращать self
(или другой объект, повторно использующий динамическую память c в случае, когда тип Output
отличается от типа Self
) вместо этого выделения нового объекта (который потребует новых динамических c выделений памяти), даже если исходное значение не используется после операции.
С другой стороны, методы PartialEq
всегда возвращают bool
. bool
не выделяет динамическую c память, поэтому нет никакой выгоды в передаче параметров по значению. Не ожидается, что для проверки того, что два объекта равны, потребуется мутировать одного или обоих объектов, поэтому параметры являются общими ссылками.
Я неправильно реализую черту Neg
?
Нет, но вы можете рассмотреть возможность реализации Neg
для Value
и &Value
(особенно если вы пишете библиотеку для использования другими).
Если Ваш тип дешевый для копирования (т.е. он маленький и не использует динамическую c память), подумайте о реализации Clone
и Copy
(возможно, путем их получения). Таким образом, вы можете передавать значения операторам, не перемещая значение в оператор, поскольку вместо этого будет скопировано значение.