Ответ 1
Эта строка:
n.set(n.get() + 1);
обескуражен в
Number::set(&mut n, n.get() + 1);
Сообщение об ошибке теперь может быть более понятным:
error[E0502]: cannot borrow 'n' as immutable because it is also borrowed as mutable
--> <anon>:18:25
|
18 | Number::set(&mut n, n.get() + 1);
| - ^ - mutable borrow ends here
| | |
| | immutable borrow occurs here
| mutable borrow occurs here
Поскольку Rust оценивает аргументы слева направо, этот код эквивалентен этому:
let arg1 = &mut n;
let arg2 = n.get() + 1;
Number::set(arg1, arg2);
Теперь должно быть очевидно, что не так. Поменяйте местами эти первые две строки, это исправит, но Rust не выполняет такого рода анализ потока управления.
Сначала это было создано как ошибка # 6268, теперь оно интегрировано в RFC 811, non-lexical-lifetimes. Если вы используете Rust 2018, NLL включается автоматически, и ваш код теперь будет компилироваться без ошибок.