[英]How to have multiple references for a single node in a tree structure using Rust
尝试使用以下结构在 rust 中创建树:
pub struct Node{
pub children: Vec<Box<Node>>,
pub parent: Option<Box<Node>>,
pub value: f32,
//.....
}
要构建一个新节点,请使用以下 function:
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 不想要多个引用,但我需要树中间的一个节点供他的父节点和他的子节点引用。
最近我一直在干预 Rust 中的树木。 要使用 rust 中的树,您将需要Rc
(单线程引用计数指针) ,以便您可以拥有多个所有权。 而且您还需要RefCell
来启用内部可变性,因为编译器不允许多个可变引用。 使用Rc
和RefCell
,您可以将TreeNode定义如下:
use std::rc::Rc;
use std::cell::RefCell;
pub struct TreeNode {
pub children: Vec<Rc<RefCell<TreeNode>>>,
pub parent: Option<Rc<RefCell<TreeNode>>>,
pub value: f32,
}
这是创建两个相互引用的节点的一种方法:
impl TreeNode {
#[inline]
pub fn new(value: f32) -> Self {
TreeNode {
value,
children: vec![],
parent: None
}
}
}
let mut root_nd = Rc::new(RefCell::new(TreeNode::new(5.0)));
let mut child_nd = Rc::new(RefCell::new(TreeNode::new(2.0)));
child_nd.borrow_mut().parent = Some(root_nd.clone()); // use Rc::clone to create a new reference to root_nd
root_nd.borrow_mut().children.push(child_nd.clone());
由于我们使用Rc::clone
来创建对节点的新引用,因此root_nd
和child_nd
不会被消耗,并且仍然可以在以后的程序中访问。
Rust 中的树的更多示例:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.