提问人:dromtrund 提问时间:5/5/2016 最后编辑:Shepmasterdromtrund 更新时间:5/5/2016 访问量:700
装箱对 & self 的引用
Boxing a reference to &mut self
问:
我是 Rust 的新手,作为学习过程的一部分,我正在尝试创建一个树结构,其中每个节点都有一个子节点的向量和对其父节点的引用。我想为节点创建一个函数,该函数采用新节点的值(暂时),将其添加到子列表,并将对自身的引用作为父节点传递。在 Rust by Example 的链表示例之后,我尝试用 .由于我既要修改父级又要传递对它的引用,所以我被卡住了,因为借用检查器不希望我取消引用(请参阅下面的代码)。addChild()
i32
Box<>
&mut self
由此我有两个问题:
在树结构中保留对父项的引用的正确方法是什么?在 C 语言中,我会保留一个指向父项的简单指针和一些子项的任意集合。
在 Rust 中,您应该如何修改和传递对同一函数中对象的引用?
下面是我的枚举和 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"),
}
}
}
答: 暂无答案
评论
unsafe
Vec
Copy