fn works<'a>(foo: &Option<&'a mut String>, s: &'a mut String) {}
fn error<'a>(foo: &RefCell<Option<&'a mut String>>, s: &'a mut String) {}
let mut s = "hi".to_string();
let foo = None;
works(&foo, &mut s);
// with this, it errors
// let bar = RefCell::new(None);
// error(&bar, &mut s);
s.len();
Если я помещаю в две строки с комментарием, возникает следующая ошибка:
error[E0502]: cannot borrow `s` as immutable because it is also borrowed as mutable
--> <anon>:16:5
|
14 | error(&bar, &mut s);
| - mutable borrow occurs here
15 |
16 | s.len();
| ^ immutable borrow occurs here
17 | }
| - mutable borrow ends here
Подписи works() и errors() выглядят довольно схожими. Но, по-видимому, компилятор знает, что вы можете обманывать его с помощью RefCell, потому что проверка чеков ведет себя по-другому.
Я даже могу "спрятать" RefCell в другом типе своего собственного, но компилятор все равно всегда делает правильные вещи (ошибки в случае использования RefCell). Как компилятор знает все это и как он работает? Указывает ли тип компилятора как "контейнер внутренней изменчивости" или что-то в этом роде?