rust - 借用亲子关系检查器

标签 rust borrow-checker

我有下面的代码生成在其注释中标记的错误消息。我想我理解了这个消息:我想借 parent 两次:一次是为了找到它的 child ,一次是作为 child 的参数(错误中的可变/不可变词不相关)。我必须证明 Child修改Parent时不消失.但我不知道该怎么做。我可以 Rc<Child>除了那个接缝之外的一切都是浪费,所以我希望增加一些生命周期可以解决问题。

struct Parent {
    used: i32,
    child: Child,
}

struct Child {
    dummy: i32,
}

impl Child { 
    fn use_parent(&mut self, parent: &mut Parent) {
        // use both child and parent
        parent.used += self.dummy;
        self.dummy += 1;
    }
}
fn main() {
    let parent = Parent {
        used: 0,
        child: Child {
            dummy: 1
        }
    };
    //Error: cannot borrow immutable local variable `parent` as mutable
    parent.child.use_parent(&mut parent);
}

最佳答案

and the mutable/immutable words in the error are not relevant

我不确定你为什么这么想。可变性在 Rust 中非常很重要!例如,虽然您可以同时多次引用不可变数据,但您一次只能引用一次可变数据。

首先,你需要修复parent的可变性:

let mut parent = // ...

然后,您将从以下行收到错误:

parent.child.use_parent(&mut parent);

当你运行这一行时,你隐式地可变地借用了 parentchild。这样做是为了您可以调用 use_parent,这需要一个 &mut self

但是,您试图获得第二个可变引用作为参数!这是一个禁忌,因为如果允许您有多个别名 可变引用,编译器将无法跟踪它并确保您不会破坏内存安全保证.

Suppose I remove the line self.dummy+=1; so there is only 1 mutable alias - can I get this to work?

让我们看看函数签名的一些变体

fn use_parent(&self, parent: &mut Parent)
// cannot borrow `parent` as mutable because `parent.child` is also borrowed as immutable

fn use_parent(&mut self, parent: &Parent)
// cannot borrow `parent` as immutable because `parent.child` is also borrowed as mutable

fn use_parent(&self, parent: &Parent)
// OK

正如我之前提到的,如果您有对某物的可变引用,则不允许任何对同一事物的其他引用(无论是否可变)。

另外,请注意方法的主体是什么并不重要! Rust 仅检查被调用函数的签名以验证借用某些东西是否安全。

那么您如何尝试解决您的问题呢?最终,您正在尝试做一些编译器很难证明安全的事情。您需要可变链接的图表。我强烈建议阅读 module documentation for Rc其中有一个正是这种父子关系的例子。

关于rust - 借用亲子关系检查器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28833622/

相关文章:

graph - 结构中的可变向量

rust - 移入封闭的结构从外部借用了引用

rust - 以内容为条件的流行元素

rust - 不使用标准库时如何迭代搜索并从列表中删除

rust - 为什么不能在同一结构中存储值和对该值的引用?

rust - 如何在不丢弃物体的情况下解构物体?

vector - 如何将两个 Rust 向量以三个为一组交织成一个新向量?

rust - 如何在 Rust 中正确包含文件?

rust - 要求类型参数是结构

string - 运行时构建 : String not found in this scope