rust - 从可变引用中引用内部值的可变规则是什么?
问题描述
从可变引用中引用内部值的可变规则是什么?
这有效:
#[derive(Debug)]
struct Outer {
name: String,
inner: Inner,
}
#[derive(Debug)]
struct Inner {
val: String,
}
fn main() {
let mut test = Outer {
inner: Inner {
val: String::from("test"),
},
name: String::from("name"),
};
let outer = &mut test;
let inner = &mut outer.inner;
*inner = Inner {
val: String::from("x"),
};
outer.inner.val.push('b');
println!("{:?}", outer); // Outer { name: "name", inner: Inner { val: "xb" } }
}
这失败了:
fn main() {
let mut test = Outer {
inner: Inner {
val: String::from("test"),
},
name: String::from("name"),
};
let outer = &mut test;
let inner = &mut test.inner; // note this time I'm using test instead of outer
*inner = Inner {
val: String::from("x"),
};
outer.inner.val.push('b');
println!("{:?}", outer);
}
和:
error[E0499]: cannot borrow `test.inner` as mutable more than once at a time
--> src/main.rs:20:17
|
19 | let outer = &mut test;
| --------- first mutable borrow occurs here
20 | let inner = &mut test.inner; // note this time I'm using test instead of outer
| ^^^^^^^^^^^^^^^ second mutable borrow occurs here
...
24 | outer.inner.val.push('b');
| --------------- first borrow later used here
解决方案
Rust book中解释了一切。
可变性的规则是(根据我的记忆写的):
您可以修改变量的内容,如果它拥有它的内容,并且没有被借用
一个变量一次只能有一个可变引用,并且只有可变引用才能读取或编辑变量的内容
您的第一个代码编译是因为还没有借用的借用,inner
在的生命周期内无法使用。outer
outer
inner
然而,在第二个代码中,你借用了两次相同的变量,违反了我写的第三条规则
推荐阅读
- gitlab-ci - 多个扩展或多个阶段?
- python - 如何在 Django 中动态生成图像 URL?
- javascript - 如何在桌面 PWA 中显示拖放图像?
- javascript - 使用 promise.all 在地图中等待优缺点的使用
- php - Laravel Valet MacOS Catalina:504 Gateway Time-out on request outside dev environment
- security - 我应该使用 JWT 令牌对游戏玩家进行身份验证吗?
- xml - SLD 代码不起作用,但未显示任何错误消息
- python - 为什么 kivy 应用程序中不显示下一个屏幕?
- google-bigquery - 有没有办法在 BigQuery 标准 SQL 中播种随机数生成过程
- github - 我如何自动将我的代码上传到 Github 存储库