Data structures 如何断言/内省嵌套的递归结构/枚举?

Data structures 如何断言/内省嵌套的递归结构/枚举?,data-structures,rust,enums,nested,Data Structures,Rust,Enums,Nested,我有一个有向图数据结构,我发现自己在与模式匹配做简单的内省。有更好的办法吗 “我的结构”允许多个家长和多个孩子: pub enum NodePtr { Terminal(i32), Node(Rc<RefCell<Node>>), } pub struct Node { children: Vec<NodePtr>, parents: Vec<Weak<RefCell<Node>>>, }

我有一个有向图数据结构,我发现自己在与模式匹配做简单的内省。有更好的办法吗

“我的结构”允许多个家长和多个孩子:

pub enum NodePtr {
    Terminal(i32),
    Node(Rc<RefCell<Node>>),
}

pub struct Node {
    children: Vec<NodePtr>,
    parents: Vec<Weak<RefCell<Node>>>,
}

我觉得我必须通过这么多的匹配才能得到我想要的。我是否错过了更好的方式,或者可能是另一种思维方式

我觉得我必须通过这么多的匹配才能得到我想要的。我是否错过了更好的方式,或者可能是另一种思维方式

您可以在实用程序函数后面抽象琐碎的模式匹配,例如:

impl NodePtr {
    /// Returns Some if NodePtr is a Node, None otherwise.
    fn as_node(&self) -> Option<&Rc<RefCell<Node>>> {
        match self {
            NodePtr::Node(rc) => Some(rc),
            _ => None,
        }
    }
}


还有一个单独的问题是,您的类型的结构是否可以避免如此多的运行时检查和恐慌的可能性。我建议您查看现有的板条箱以构建DAG。

您的大多数代码都由闭合大括号和
assert组成!(错误)
。你能展示另一个你认为缺乏优雅/人体工程学的例子吗?还要注意的是,您可以将
选项::Some
拼写为
Some
。如果使用
选项::unwrap
并进行
unwrapde
,所有这些都会大大减少嵌套:@loganfsmyth这正是我想要的——谢谢——当你知道会发生什么时,创建这些类型的帮助函数是典型的吗?@user4815162342你的大部分代码都由闭括号和assert组成!(错)这就是问题所在——我在问如何简化code@prior很公平。我想说的是,简化特定函数的方法可能适用于处理图形的其他代码。或者您是说,使用图形执行任何操作都需要类似的
assert!(false)
检查?同意——这比@loganfsmyth在评论中的回答要好一点,因为它避免了恐慌,直到最后一刻,让外部调用方选择使用
.unwrap()
,或者不使用他们希望的。
// prove parent & child relationship
let parent_rc = parent.as_node().unwrap();
let child_rc = child.as_node().unwrap();
assert_eq!(parent_rc.borrow().children.len(), 1);
let node_ptr = &parent_rc.borrow().children[0];
assert!(Rc::ptr_eq(node_ptr.as_node().unwrap(), child_rc));
assert_eq!(child_rc.borrow().parents.len(), 1);
let weak = &child_rc.borrow().parents[0];
assert!(Rc::ptr_eq(&weak.upgrade().unwrap(), parent_rc));