3

我是 Rust 的新手,作为学习过程的一部分,我正在尝试创建一个树结构,其中每个节点都有一个子节点向量和对其父节点的引用。我想为addChild()节点创建一个函数,该函数采用新节点的值(i32现在为 s ),将其添加到子列表中,并将对自身的引用作为父节点传递。在 Rust by Example 的链表示例之后,我尝试使用Box<>. 由于我同时修改了父对象并传递了对它的引用,所以我被卡住了,因为借用检查器不希望我取消引用&mut self(参见下面的代码)。

由此我有两个问题:

  1. 在树结构中保留对父级的引用的正确方法是什么?在 CI 中,将保留一个指向父级的简单指针和一些任意子级的集合。

  2. 你应该如何在 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"),
        }
    }
}
4

0 回答 0