我是 Rust 的新手,作为学习过程的一部分,我正在尝试创建一个树结构,其中每个节点都有一个子节点向量和对其父节点的引用。我想为addChild()
节点创建一个函数,该函数采用新节点的值(i32
现在为 s ),将其添加到子列表中,并将对自身的引用作为父节点传递。在 Rust by Example 的链表示例之后,我尝试使用Box<>
. 由于我同时修改了父对象并传递了对它的引用,所以我被卡住了,因为借用检查器不希望我取消引用&mut self
(参见下面的代码)。
由此我有两个问题:
在树结构中保留对父级的引用的正确方法是什么?在 CI 中,将保留一个指向父级的简单指针和一些任意子级的集合。
你应该如何在 Rust 的同一个函数中修改和传递对对象的引用?
下面是我的 enum 和 impl 的完整代码,带有一个额外的测试函数来修改 self 而不通过它。
#[derive(Hash, Eq, PartialEq)]
enum Node {
Elem {
value: i32,
parent: Box<Node>,
children: Vec<Node>,
},
Nil,
}
impl Node {
fn new(value: i32, parent: Box<Node>) -> Node {
return Node::Elem {
value: value,
parent: parent,
children: Vec::new(),
};
}
// This function works fine
fn setValue(&mut self, v: i32) {
match self {
&mut Node::Elem { ref mut value, .. } => *value = v,
&mut Node::Nil => {}
}
}
fn addChild(&mut self, value: i32) {
match self {
&mut Node::Elem { ref mut children, .. } => {
(*children).push(Node::new(value, Box::new(*self)))
// Produces E0507 (Cannot move out of borrowed context)
}
&mut Node::Nil => println!("Failed to add children to empty node"),
}
}
}