如何使用Rust在树结构中对单个节点具有多个引用

问题描述 投票:0回答:1

尝试使用以下结构在锈中创建树:

pub struct Node{
    pub children: Vec<Box<Node>>,
    pub parent: Option<Box<Node>>,
    pub value: f32,
    //.....
}

要构建新节点,请使用以下功能:

pub fn build_node(parent: Option<Box<Node>>)-> Node{
    Node{
        children: vec![],
        parent,
        value: 0.0,

    }
}

[尝试添加节点时,例如:

let mut root_nd = tree::build_node(None, 5, state);
let mut next_nd = tree::build_node(Some(Box::new(root_nd)), 2);
root_nd.children.push(Box::new(next_nd));

会有错误,因为例如我要借用root_nd,然后尝试将next_nd添加到root.children列表中,即使没有此错误,我仍然需要next_nd的参考将其添加到root_nd的子级之后。我知道在rust中,同一元素不可能同时具有多个可变引用。因此问题是,如何在rust中建立具有双向引用的树状数据结构?在我看来,这是一个冲突,因为rust不需要多个引用,但是我需要树的中间的一个节点同时被其父节点和其子节点都引用。

reference rust tree
1个回答
0
投票

最近我一直在Rust中干预树木。要使用生锈的树木,您需要Rc (A single-threaded reference-counting pointer),以便可以拥有多个所有权。而且您还需要Rc来启用内部可变性,因为编译器不允许多个可变引用。使用RefCellRc,可以如下定义TreeNode

© www.soinside.com 2019 - 2024. All rights reserved.