我有下面的代码生成在其注释中标记的错误消息。我想我理解了这个消息:我想借 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);
当你运行这一行时,你隐式地可变地借用了 parent
和 child
。这样做是为了您可以调用 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/