可变借用不一致
Mutable Borrows Inconsistency
以下 program_pass 在 Rust 中编译。
fn main() {
let mut x = 0;
let mut y = &mut x;
let mut z = &mut y;
let mut last = &mut z;
let mut alt_y = &mut x;
let mut alt_z = &mut alt_y;
z = &mut alt_y; // *last = &mut alt_y;
}
以下program_error没有。
fn main() {
let mut x = 0;
let mut y = &mut x;
let mut z = &mut y;
let mut last = &mut z;
let mut alt_y = &mut x;
let mut alt_z = &mut alt_y;
*last = &mut alt_y; // z = &mut alt_y;
}
program_error 中违反了什么,而 program_pass 中没有?
刚开始,但这真的违背了我对 Rust 的理解。
这不是不一致,而是预期行为。
在第一种情况下,没有使用可变引用。实际上没问题,所以 rust 编译器很高兴。
在第二种情况下,rust 编译器发现可变引用 last
正在被取消引用,因此将其视为值访问。正如我们所知,rust 不允许这两个可变借用。
参考:Deref
为了证明我的观点,对你的程序做了一些调整
fn main() {
let mut x = 0;
let mut y = &mut x;
let mut z = &mut y;
let mut last = &mut z;
let mut alt_y = &mut x;
let mut alt_z = &mut alt_y;
// notice the RHS here assigning
// mutable reference of i32 literal
*last = &mut &mut 4;
// ^ not related to x anyhow
}
现在错误将揭示问题背后的原因\
error[E0499]: cannot borrow `x` as mutable more than once at a time
--> src/main.rs:7:21
|
3 | let mut y = &mut x;
| ------ first mutable borrow occurs here
...
7 | let mut alt_y = &mut x;
| ^^^^^^ second mutable borrow occurs here
...
11 | *last = &mut &mut 4;
| ------------------- first borrow later used here
以下 program_pass 在 Rust 中编译。
fn main() {
let mut x = 0;
let mut y = &mut x;
let mut z = &mut y;
let mut last = &mut z;
let mut alt_y = &mut x;
let mut alt_z = &mut alt_y;
z = &mut alt_y; // *last = &mut alt_y;
}
以下program_error没有。
fn main() {
let mut x = 0;
let mut y = &mut x;
let mut z = &mut y;
let mut last = &mut z;
let mut alt_y = &mut x;
let mut alt_z = &mut alt_y;
*last = &mut alt_y; // z = &mut alt_y;
}
program_error 中违反了什么,而 program_pass 中没有? 刚开始,但这真的违背了我对 Rust 的理解。
这不是不一致,而是预期行为。
在第一种情况下,没有使用可变引用。实际上没问题,所以 rust 编译器很高兴。
在第二种情况下,rust 编译器发现可变引用 last
正在被取消引用,因此将其视为值访问。正如我们所知,rust 不允许这两个可变借用。
参考:Deref
为了证明我的观点,对你的程序做了一些调整
fn main() {
let mut x = 0;
let mut y = &mut x;
let mut z = &mut y;
let mut last = &mut z;
let mut alt_y = &mut x;
let mut alt_z = &mut alt_y;
// notice the RHS here assigning
// mutable reference of i32 literal
*last = &mut &mut 4;
// ^ not related to x anyhow
}
现在错误将揭示问题背后的原因\
error[E0499]: cannot borrow `x` as mutable more than once at a time
--> src/main.rs:7:21
|
3 | let mut y = &mut x;
| ------ first mutable borrow occurs here
...
7 | let mut alt_y = &mut x;
| ^^^^^^ second mutable borrow occurs here
...
11 | *last = &mut &mut 4;
| ------------------- first borrow later used here