С помощью простого объекта я могу получить изменяемые ссылки на отдельные поля:
struct MyObject {
pub a: i32,
pub b: i32,
}
fn func_1(obj: &mut MyObject) {
let a = &mut obj.a;
let b = &mut obj.b;
*a += 1;
*b *= 2;
}
Это не работает, если obj
является MutexGuard
или RefMut
:
fn func_3(mtx: &Mutex<MyObject>) {
let mut obj = mtx.lock().unwrap();
let a = &mut obj.a;
let b = &mut obj.b; // fails
...
}
fn func_4(rfc: &mut RefCell<MyObject>) {
let mut obj = rfc.borrow_mut();
let a = &mut obj.a;
let b = &mut obj.b; // fails
...
}
Обе ошибки:
error[E0499]: cannot borrow `obj` as mutable more than once at a time
--> src/main.rs:28:18
|
27 | let a = &mut obj.a;
| --- first mutable borrow occurs here
28 | let b = &mut obj.b; // fails
| ^^^ second mutable borrow occurs here
Однако, этот работает , если obj
является Box
:
fn func_2(obj: &mut Box<MyObject>) {
let a = &mut obj.a;
let b = &mut obj.b;
*a += 1;
*b *= 2;
}
См. На Rust Playground .
Мой главный вопрос - почему. Почему компилятор знает, что это нормально для Box
, но не для остальных? Box
особенный?