rust - 很难管理引用和取消引用的化合物
问题描述
let mut x = 1;
let a = &mut x;
let b = &mut *a;
*a = 2; // error. b borrows a
*b = 3; // it works! (only without " *a = 2 ")
let mut x = 1;
let b;
{
let a = &mut x;
b = &mut *a;
} // a drops here
*b = 2; // it works!
我很难理解这&*a
意味着什么lifetime
。我不知道*
运算符如何与变量的生命周期相关。
好像 b 借了 x 也借了 a,所以不仅 x(即 *a) 不能移动或修改,也a
不能使用。
编译器的错误信息是:b 借用了 a。
所以,我运行了第二个代码。据我了解,借来的数据不能重新分配、移动或丢弃。之前我特意做a
了drop b
,以确保它a
的寿命应该比b
's长。
但是,第二个代码仍然有效。
那么,我如何理解与 相关的生命周期&mut *a
?
解决方案
重要的误解出现在您的第一行代码中。错误不是 that b
borrows a
,而是 that b
borrows *a
,意思是它借用了 x。由于 Rust 会尽早降级并删除引用,因此只要您不尝试使用a
. 但是,当使用 时a
,编译器现在会警告您有一个双重可变引用:一个借用*a
(基本上x
)在变量a
中,一个借用*a
在变量 中b
。
清除后,您的第二段代码就有意义了。a
可以删除,因为b
只是*a
用来借用x
,并且x
有足够长的生命周期来访问。
推荐阅读
- android-studio - Android Studio:如何让谷歌地图标记监听 DragOver 事件?
- reactjs - React:导入声明只能出现在模块的顶层
- javascript - discord bot 命令,提及未定义
- wordpress - 本地主机上的 Wordpress 容器不起作用
- http - 即使安装后也无法在 Windows 中运行 http 命令
- ios - 在 IOS 真实设备上构建嵌入 Pods 框架错误
- android - Xamarin 使用什么?
- c - I 如何在 do while 表达式中输出最低成绩(和出现次数)
- javascript - Three.js Orbitcontrols 计算设置相机向上旋转以进行鸟瞰
- go - 重构 golang 函数 - 应该使用什么类型?