Если я понял, невозможно создать изменяемое заимствование поверх std::rc::Rc
в Rust, вы должны использовать Cell
или RefCell
. Но все равно я не могу понять, как ими пользоваться. Например, рассмотрим этот простой пример:
use std::cell::RefCell;
struct X (i32);
impl X {
fn foo(&mut self) {
self.0 = 0;
}
}
fn main () {
let x = X(5);
let rcx = RefCell::new(&x);
let mut mutx: std::cell::RefMut<&X> = rcx.borrow_mut();
(*mutx).foo();
}
Я получаю следующую ошибку:
16:5: 16:9 error: cannot borrow immutable local variable `mutx` as mutable
16 mutx.foo();
Но если я удалю ссылку из строки (и обновлю тип mutx
):
let rcx = RefCell::new(x);
Все отлично. Но я не могу понять почему, поскольку RefMut::deref_mut() -> &mut T
почтение, вызванное в строке 16, должно возвращать &&mut T
в первом случае, а &mut T
во втором случае. Но поскольку компилятор должен применять много *
по мере необходимости (если я понимаю, как deref coercion работает) не должно быть разницы между RefMut<X>::deref_mut()
и RefMut<&X>::deref_mut()
Изменить: по ошибке я забыл написать mut
в строке 15, так как в связанном примере это правильно написано. Итак, теперь let mut mutx...