rust - 使用现有可变引用的嵌套方法调用
问题描述
以下代码编译成功:
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,两阶段借用在这里不适用?
我怀疑在第一个示例中没有错误,因为编译器没有创建中间引用并且它使用相同的引用:r
因此没有多次借用。但是,如果是这样的话,为什么下面的代码无法编译
let mut v = vec![1];
let r = &mut v;
r.push({r.push(0);1});
解决方案
第一个例子:
let mut v = vec![1];
let r = &mut v;
r.push(r.len());
如果没有 2 阶段借用,代码将无法编译,因为外部调用创建了r
:的重借&mut *r
,而内部调用创建了具有相同值的新的不可变重借:&*r
。
使用 2 阶段借用,第一个重借将转换为&mut2 *r
并稍后在第二个重借超出范围时激活。
第二个例子:
let mut v = vec![1];
let r = &mut v;
r.push(v.len());
即使使用 2-phase 借用,它也无法编译。
内部调用导致v
:与 .&mut v
冲突的重借r
。
第三个例子:
let mut v = vec![1];
let r = &mut v;
r.push({r.push(0);0});
即使使用 2-phase 借用,它也无法编译。
内部调用需要2 阶段&mut2
借用*r
不允许的重借,因为外部调用已经创建&mut2
了*r
.
参考资料:
推荐阅读
- reactjs - 如何在 React 类中停止重复的 Ajax 调用?
- php - 控制结构中的 () 和 (()) 有什么区别?
- go - Golang 切片拷贝
- javascript - 比较两个画布图像(参考一个和网站上的当前)
- html - 如何设置边框底部以覆盖文本的宽度而不是整个汉堡菜单?
- android - AndroidRuntime: FATAL EXCEPTION: create_react_context Expo React Native App - Release only
- c# - 更改条目文本导致 Xamarin 中的无限循环
- c# - C# 重放存储在文本文件中的 Web 请求
- spring-boot - Spring Batch:没有为 JDBCBatchItemWriter 的 SQL 参数错误提供值
- javascript - 在 Ember Octane 中附加 DOM 元素