【发布时间】:2020-11-15 18:16:36
【问题描述】:
我有一个有向图数据结构,我发现自己在与模式匹配作斗争以进行简单的内省。有没有更好的办法?
我的结构除了多个孩子之外还允许多个父母:
pub enum NodePtr {
Terminal(i32),
Node(Rc<RefCell<Node>>),
}
pub struct Node {
children: Vec<NodePtr>,
parents: Vec<Weak<RefCell<Node>>>,
}
这是我可以设计的最简单的代码来断言单个父子关系已按预期建立:
fn example(parent: NodePtr, child: NodePtr) {
if let NodePtr::Node(parent_rc) = &parent {
if let NodePtr::Node(child_rc) = &child {
assert_eq!(parent_rc.borrow().children.len(), 1);
if let Option::Some(node_ptr) = parent_rc.borrow().children.get(0) {
if let NodePtr::Node(rc) = node_ptr {
assert!(Rc::ptr_eq(rc, child_rc));
} else {
assert!(false);
}
} else {
assert!(false);
}
assert_eq!(child_rc.borrow().parents.len(), 1);
if let Option::Some(weak) = child_rc.borrow().parents.get(0) {
if let Some(rc) = weak.upgrade() {
assert!(Rc::ptr_eq(&rc, parent_rc));
} else {
assert!(false);
}
} else {
assert!(false);
}
} else {
assert!(false);
}
} else {
assert!(false)
};
}
感觉就像我必须经历如此多的匹配才能得到我想要的。我是否错过了更好的方法或不同的思维方式?
【问题讨论】:
-
大部分代码由右大括号和
assert!(false)组成。你能举出另一个你认为缺乏优雅/人体工程学的例子吗?另请注意,您可以将Option::Some拼写为Some。 -
如果您使用
Option::unwrap并创建一个unwrapNode,所有这些都将大大减少嵌套:play.rust-lang.org/… -
@loganfsmyth 这正是我正在寻找的——谢谢——当你知道会发生什么时创建这些类型的辅助函数是典型的吗?
-
@user4815162342 你的大部分代码都由右大括号和断言组成!(false) 这有点意思——我在问如何简化代码
-
@prior 很公平。我想说的是,简化该特定函数的方法可能适用于处理图形的其他代码。或者您是说对图表进行任何事情都需要类似的大量
assert!(false)检查?
标签: data-structures rust enums nested