Я борюсь с реализацией древовидной структуры в Rust. В частности, получение и изменение значения узла. Какой идиоматический способ работы с ценностью?
Примечание: реализация дана и не может быть изменена.
use std::rc::Rc;
use std::cell::RefCell;
// Definition for a binary tree node.
#[derive(Debug, PartialEq, Eq)]
pub struct TreeNode {
pub val: i32,
pub left: Option<Rc<RefCell<TreeNode>>>,
pub right: Option<Rc<RefCell<TreeNode>>>,
}
impl TreeNode {
#[inline]
pub fn new(val: i32) -> Self {
TreeNode {
val,
left: None,
right: None
}
}
}
fn main() {
let mut root = Some(Rc::new(RefCell::new(TreeNode::new(1))));
println!("{:?}", root.unwrap().borrow().val); // cannot infer type for type parameter `Borrowed`
root.unwrap().get_mut().val = 2; // cannot borrow data in an `Rc` as mutable
}
root
перемещается после вызоваunwrap()
. Вторая причина заключается в том, что вы должны использоватьborrow_mut()
вместоget_mut()
. Последний использует типичную внутреннюю изменчивость вместо внутренней изменчивости. - person E_net4 the curator   schedule 07.05.2020let mut root = TreeNode::new(1)
, затем заполните ветки - person Alexey Larionov   schedule 07.05.2020Rc<RefCell<TreeNode>>
означает, что узлы могут использоваться несколькими родителями. Так ли это? Я бы ожидал, что узлы в дереве будут владеть своими дочерними элементами, скажем,Box<TreeNode>
. - person John Kugelman   schedule 07.05.2020