我不确定是什么地方出了问题:
我有一个枚举,如下所示:
#[derive(Debug,PartialEq)]
pub enum Tree {
Leaf,
Node(Box<Tree>,i32,Box<Tree>)
}
当我想求这棵树上所有叶子的总和时
pub fn tree_sum(t:&Tree) -> i32 {
match t {
Tree::Leaf => 0,
Tree::Node(Leaf, x, Leaf) => *x
}
}
编译器决定给予我一个非常奇怪的错误:
error[E0416]: identifier `Leaf` is bound more than once in the same pattern
--> src/functions.rs:11:28
|
11 | Tree::Node(Leaf,x, Leaf) => *x,
| ^^^^ used in a pattern more than once
有人能给我解释一下哪里出了问题,应该用什么来代替?
2条答案
按热度按时间dphi5xsq1#
Tree::Node
变量包含不是枚举的类型(Box<Tree>
),这意味着您无法在内部变量上进行匹配。这里发生的事情是,正如编译器告诉您的那样,您创建了两个具有相同名称的不同绑定。
如果我们假设您只对节点的内容感兴趣,您可以执行以下操作:
其中
leaf1
和leaf2
都是&Box<Tree>
类型。现在还不清楚
match
的目标是什么,如果你只对包含两个叶子的节点感兴趣,那么这将使match
不是穷举的,你需要添加默认情况。如果您对内部树的值不感兴趣,而只对
*x
感兴趣,则可以执行以下操作:这是详尽的。
如果你想匹配包含两个叶子的节点,那么你需要更有创造性。
请注意,
leaf1
和leaf2
会被解除指涉两次才能解除boxed。这是必要的,因为t
原本就是指涉。也需要预设的样式。请在playground上查看。
gev0vcfq2#
Leaf是绑定到该枚举变量的一部分的变量的名称。您只需为Leaf选择一个不同的名称。