До сих пор я понимал, что в Rust операторы в основном являются синтаксисом c сахаром для вызовов методов-признаков. В частности, я думал, что a += b
эквивалентно написанию a.add_assign(b)
. Сегодня я был очень удивлен, услышав от ржавчины c (1.44.1) следующее:
error[E0368]: binary assignment operation `+=` cannot be applied to type `&mut u8`
--> src/main.rs:2:5
|
2 | a += b;
| -^^^^^
| |
| cannot use `+=` on type `&mut u8`
|
help: `+=` can be used on 'u8', you can dereference `a`
|
2 | *a += b;
| ^^
Код, ответственный за сообщение об ошибке: ( Playground )
fn test_add_assign(a: &mut u8, b: u8) {
a += b;
}
fn main() {
let mut test = 1;
test_add_assign(&mut test, 1);
assert_eq!(test, 2);
}
Теперь компилятор исправен, запись *a += b
работает, а также правильно присваивает новую переменную. Однако, к моему удивлению, a.add_assign(b)
также отлично работает без необходимости разыменования a
( Playground ):
fn test_add_assign(a: &mut u8, b: u8) {
a.add_assign(b);
}
Учитывая, что документация для AddAssign
просто указывает
Оператор присваивания сложения +=
.
Мне интересно: какова связь между AddAssign
и оператором +=
, если это не синтаксис c сахар для вызова метода черты?