您收到错误消息的原因不同。你有一个不可变的变量parent
,并试图为&mut
它创建一个。修复你得到的
let mut parent = Parent {
used: 0,
child: Child {
dummy: 1
}
};
parent.child.use_parent(&mut parent);
以及相应的错误
<anon>:31:34: 31:40 error: cannot borrow `parent` as mutable more than once at a time
<anon>:31 parent.child.use_parent(&mut parent);
^~~~~~
<anon>:31:5: 31:17 note: previous borrow of `parent.child` occurs here; the mutable borrow prevents subsequent moves, borrows, or modification of `parent.child` until the borrow ends
<anon>:31 parent.child.use_parent(&mut parent);
^~~~~~~~~~~~
<anon>:31:41: 31:41 note: previous borrow ends here
<anon>:31 parent.child.use_parent(&mut parent);
^
你几乎得出了正确的结论。
我必须证明 Child 在修改 Parent 时不会消失
不完全的。你必须证明你永远不会有两个&mut
或一个&mut
和一个&
给孩子。如果你有一个&mut
给父母,你可以用它来&mut
给孩子。因此,如果你有一个&mut
给父母和一个&mut
给孩子,你可以&mut
给孩子两个。
我看到的唯一解决方案是将use
函数移动到Parent
type 并访问child
through self
。
impl Parent {
fn use_parent(&mut self) {
// use both child and parent
self.used += self.child.dummy;
self.child.dummy += 1;
}
}
处理您的评论:
不幸的是,该解决方案适用于这个简化的问题,但不适用于我的实际问题。父母有一个孩子的向量,它可能有深层嵌套的孙子。我不能只说 self.child
由于您不应该修改您的向量(并且不能,Rust 保护您),因为这会使对子项的引用无效,您可以将这些部分传递给您需要的函数,但没有直接父项的部分的孩子。
impl Child {
fn use_parent(&mut self, used: &mut i32) {
// use both child and parent
*used += self.dummy;
self.dummy += 1;
}
}
fn main() {
let mut parent = Parent {
used: 0,
child: Child {
dummy: 1
}
};
// although both point to elements of the same structure
// it is guaranteed at compile-time that they point to
// non-overlapping parts
let child = &mut parent.child;
let used = &mut parent.used;
child.use_parent(used);
}
不幸的是,我没有办法证明use_parent
's 的参数指向同一个Parent
对象的一部分。也许这可以用一生来完成,我不确定,但我会对此非常感兴趣。注意:Rc
有同样的问题。