Почему оператор binary + не работает с двумя и mut int?

fn increment(number: &mut int) {
 // this fails with: binary operation `+` cannot be applied to type `&mut int`
 //let foo = number + number;
 let foo = number.add(number);
 println!("{}", foo);
}
fn main() {
 let mut test = 5;
 increment(&mut test);
 println!("{}", test);
}

Почему выполняется number + number, но number.add(number) работает?

В качестве бонусного вопроса: вышесказанное выдает

10
5

Можно ли предположить, что test все еще 5, потому что данные скопированы для увеличения? Единственный способ, по которому исходная переменная test может быть изменена функцией increment, была бы, если бы она была отправлена ​​как Box, правильно?

1 ответ

number + number терпит неудачу, потому что это две ссылки, а не два int. Компилятор также сообщает нам, почему: оператор + не реализован для типа &mut int.

Вам нужно разыменовать оператор разворота *, чтобы получить в int. Это будет работать let sum = *number + *number;

number.add(number); работает, потому что подпись добавляет fn add(&self, &int) -> int;

Я имею право предположить, что тест все еще 5, потому что данные копируются чтобы увеличить? Единственный способ, с помощью которого исходная тестовая переменная быть мутированным с помощью функции приращения, было бы, если бы оно было отправлено как Коробка, правильно?

Тест не копируется, но все еще 5, потому что он никогда не мутировал. Вы можете изменить его в инкрементной функции, если хотите.

PS: мутировать его

fn increment(number: &mut int) {
 *number = *number + *number;
 println!("{}", number);
}

licensed under cc by-sa 3.0 with attribution.