Rust 内部可变性示例代码改进

问题描述

我正在尝试学习 Rust 内部可变性的一些基本概念。并尝试实现一个树状数据结构示例:

    1. 每个节点都有一个父节点。
    1. 每个节点都有一些子节点。
    1. 从每个节点我可以改变父节点和所有子节点,不仅是节点的数量,还有一些节点属性
    1. 没有循环引用问题。

我写的代码列表如下,但有点难看,可能有一些性能问题。所以问题是如何提高代码质量。欢迎提出任何建议。

use std::rc::Rc;
use std::cell::RefCell;
use std::rc::Weak;

#[derive(Debug)]
struct Node {
    value: i32,parent: RefCell<Weak<RefCell<Node>>>,children: RefCell<Vec<Rc<RefCell<Node>>>>,}

fn main() {
    let leaf = Rc::new(RefCell::new(Node {
        value: 3,parent: RefCell::new(Weak::new()),children: RefCell::new(vec![]),}));

    println!(
        "leaf strong = {},weak = {}",Rc::strong_count(&leaf),Rc::weak_count(&leaf),);

    {
        let branch = Rc::new(RefCell::new(Node {
            value: 5,children: RefCell::new(vec![Rc::clone(&leaf)]),}));

        
        *(*leaf).borrow_mut().parent.borrow_mut() = Rc::downgrade(&branch);
        // try to change parent data attribute from leaf
        (*(*(*(*leaf).borrow_mut().parent.borrow_mut()).upgrade().unwrap()).borrow_mut()).value = 20 ;

        println!("branch value change to : {:?}",branch.borrow().value);

        println!(
            "branch strong = {},Rc::strong_count(&branch),Rc::weak_count(&branch),);

        println!(
            "leaf strong = {},);
    }

    println!("leaf parent = {:?}",(*leaf).borrow_mut().parent.borrow_mut().upgrade());
    println!(
        "leaf strong = {},);

}

输出是:

leaf strong = 1,weak = 0
branch value change to : 20
branch strong = 1,weak = 1
leaf strong = 2,weak = 0
leaf parent = None
leaf strong = 1,weak = 0

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)