Следующий код успешно компилируется:
let mut v = vec![1];
let r = &mut v;
r.push(r.len());
пока этот не работает:
let mut v = vec![1];
let r = &mut v;
r.push(v.len());
с ошибкой:
error[E0502]: cannot borrow `v` as immutable because it is also borrowed as mutable
|
| let r = &mut v;
| ------ mutable borrow occurs here
| r.push(v.len());
| ^ immutable borrow occurs here
| r.push(r.len());
| - mutable borrow later used here
- Почему первый пример компилируется правильно? Это потому, что одна и та же ссылка:
r
используется во внешних и внутренних вызовах? Или это потому, что он применяет RFC 2025, двухфазные заимствования? Или что-то другое? - Почему второй пример терпит неудачу, если первый пример успешен? Почему RFC 2025, Two-Phase Borrows соответствует здесь не применимо?
Я подозреваю, что в первом примере ошибок нет, потому что компилятор не создает промежуточных ссылок и использует ту же ссылку: r
, чтобы не было множественных заимствований. Однако, если это так, почему следующий код не может быть скомпилирован
let mut v = vec![1];
let r = &mut v;
r.push({r.push(0);1});