【发布时间】:2020-12-28 11:48:18
【问题描述】:
以下代码编译成功:
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, Two-Phase Borrows?还是别的什么? - 鉴于第一个示例成功,为什么第二个示例失败?为什么RFC 2025, Two-Phase Borrows 不适用于此处?
我怀疑在第一个示例中没有错误,因为编译器没有创建中间引用并且它使用相同的引用:r,因此没有多次借用。
但是,如果是这样,为什么下面的代码编译失败
let mut v = vec![1];
let r = &mut v;
r.push({r.push(0);1});
【问题讨论】:
标签: rust reference borrow-checker borrowing