Для текущей версии вопроса
fn add_assign(&mut self, other: &Self)
Ваш запрос невозможен.
У вас не может быть изменяемой ссылки и неизменной ссылки на одно и то же значениев то же время.Это фундаментальный аспект Rust.
Пожалуйста, перечитайте Правила ссылок .
См. Также:
fn add_assign(&mut self, other: Self)
Ваш запрос невозможен.
Вам нужен один экземпляр struct A
для вызова метода и другой экземпляр A
для передачи в качестве аргумента.Ваш тип не реализует Copy
или Clone
и не предоставляет каких-либо эквивалентных методов, поэтому нет способа получить второй экземпляр.
Кроме этого, не существует универсального способа взятьизменяемая ссылка на значение и извлечение из него собственной стоимости.
См. также:
Временные решения
Если вы реализуете Copy
или Clone
, то вы можете получить второе значение из оригинала и затем вызвать любую из ваших версий.
Если вы реализовали Copy
:
Если только Clone
:
Возможно, вы захотите реализовать черту AddAssign
для обеспечения синтаксического сахара.Предполагается, что вы реализовали Copy
:
impl A {
fn double(&mut self) {
*self += *self;
}
}
impl std::ops::AddAssign<Self> for A {
fn add_assign(&mut self, other: Self) {
self.x += other.x;
}
}
Комментарий Stargateur также может быть применим, поскольку i32
реализует Copy
:
impl A {
fn double(&mut self) {
*self += self.x;
}
}
impl std::ops::AddAssign<i32> for A {
fn add_assign(&mut self, other: i32) {
self.x += other;
}
}