【发布时间】:2021-11-20 17:21:57
【问题描述】:
从可变引用可变引用内部值的规则是什么?
这行得通:
#[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
【问题讨论】:
-
一般来说,您要么使用
test.inner = Inner{...}而不创建新借用,要么在创建新借用之前释放旧借用{ let outer = &mut test; ...; /*outer is destroyed*/ } { let inner = &mut test.inner; ... } -
您可以使用现有的引用来引用它内部的值 - 这不算作别名。但是,当内部引用处于活动状态时,它将使外部引用不可用。例如,如果您在第一个示例中交换
*inner = ...和outer.inner.val.push行,它将停止编译。总之,你不能有别名,但你可以有可变引用的嵌套。
标签: rust borrow-checker