Что здесь происходит (playground)?Не может заимствовать как неизменный, потому что он также заимствован как изменяемый в аргументах функции
struct Number {
num: i32
}
impl Number {
fn set(&mut self, new_num: i32) {
self.num = new_num;
}
fn get(&self) -> i32 {
self.num
}
}
fn main() {
let mut n = Number{ num: 0 };
n.set(n.get() + 1);
}
дает эту ошибку:
error[E0502]: cannot borrow `n` as immutable because it is also borrowed as mutable
--> <anon>:17:11
|
17 | n.set(n.get() + 1);
| - ^ - mutable borrow ends here
| | |
| | immutable borrow occurs here
| mutable borrow occurs here
Однако, если вы просто изменить код, чтобы это работает:
fn main() {
let mut n = Number{ num: 0 };
let tmp = n.get() + 1;
n.set(tmp);
}
мне те выглядят точно эквивалент - я имею в виду, я бы ожидать, первый должен быть преобразован в последний во время компиляции. Разве Rust не оценивает все функциональные параметры перед оценкой вызова функции следующего уровня?
Подробные сведения о процессе проверки заимствования можно найти здесь (https://github.com/rust-lang/rust/tree/master/src/librustc_borrowck/borrowck). – ljedrz
Существует макрос [unborrow macro] (https://github.com/durka/unborrow) для обходного пути и обсуждение [reddit] (https://www.reddit.com/r/rust/comments/575tc7/why_does_rust_not_allow_disjoint_mutable_borrows /) – wimh
Ага, спасибо wimh! – Timmmm