可变借用不一致

Mutable Borrows Inconsistency

提问人:discombobulated 提问时间:4/13/2022 最后编辑:Herohtardiscombobulated 更新时间:4/13/2022 访问量:77

问:

以下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 的理解。

类型 可变 借用检查器

评论

0赞 discombobulated 4/13/2022
我想这是关于通过 rust 无法接受的参考进行变异。
3赞 chepner 4/13/2022
编译器在尝试使用其中之一(、via 和 )之前特别指出 和 是可变借用的。第一个代码中没有使用任何借用;你只是借用别的东西。yalt_yxylastzz
1赞 Herohtar 4/13/2022
与其比较两个程序并问“为什么这个程序编译而另一个程序不编译?”,不如从失败的程序中读取具体的错误细节,以了解它失败的原因。如果你仍然不明白当时发生了什么,那么对错误做一些研究(不止一个可变的借用),如果你仍然找不到任何东西,问一个具体的问题,关于你不理解这个错误的地方。

答:

1赞 Arjun 4/13/2022 #1

这不是不一致,而是一种预期的行为
在第一种情况下,没有使用可变引用。实际上没有问题,所以 rust 编译器很高兴。

在第二种情况下,rust 编译器看到可变引用正在被取消引用,因此将其视为值访问。正如我们所知,rust 不允许两种可变借用。last

参考资料: 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

enter image description here

评论

1赞 Arjun 4/13/2022
已经阅读了建议,我完全同意并理解其背后的原因。但在这种情况下,我觉得这是必要的。