首页 > 解决方案 > 从可变引用中引用内部值的可变规则是什么?

问题描述

从可变引用中引用内部值的可变规则是什么?

这有效:

#[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

标签: rustborrow-checker

解决方案


Rust book中解释了一切。

可变性的规则是(根据我的记忆写的):

  • 您可以修改变量的内容,如果它拥有它的内容,并且没有被借用

  • 一个变量一次只能有一个可变引用,并且只有可变引用才能读取或编辑变量的内容

您的第一个代码编译是因为还没有借用的借用,inner在的生命周期内无法使用。outerouterinner

然而,在第二个代码中,你借用了两次相同的变量,违反了我写的第三条规则


推荐阅读