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
). Как компилятор знает все это и как он работает? Указывает ли тип компилятора как "контейнер внутренней изменчивости" или что-то в этом роде?