我有一个Tree
,我想创建一个新的空树。我的第一个想法是:
struct Tree<T> {
key: T,
l: Option<Box<Tree<T>>>,
r: Option<Box<Tree<T>>>,
}
impl<T: Ord> Tree<T> {
/// Creates an empty tree
pub fn new() -> Self {
Tree {
key: None, // error of mismatch type
l: None,
r: None,
}
}
}
我收到Error: mismatched types [E0308]
类型T
不匹配类型None
是否存在问题?
答案 0 :(得分:5)
我会做类似的事情:
type Tree<T> = Option<Box<TreeNode<T>>>;
struct TreeNode<T> {
key: T,
l: Tree<T>,
r: Tree<T>,
}
现在创建一个空的Tree
很容易(仅None
),因为它将两个Tree
绑定到一个新的更大的。{/ p>
如果您不喜欢None
- as-empty或根树中的框,您可以添加包装类型而不是别名Tree
,但主要思路是相同的:将Option
从左/右分支移动到节点类型。
答案 1 :(得分:5)
为什么不让你的Tree
枚举而不是结构?
我要像这样创建二进制文件Tree
:
enum Tree<T> {
Empty,
Node {
val: T,
l: Box<Tree<T>>,
r: Box<Tree<T>>,
},
}
然后您可以像这样实现它:
impl<T: Ord> Tree<T> {
fn empty() -> Self {
Tree::Empty
}
fn singleton(val: T) -> Self {
Tree::Node {
val: val,
l: Box::new(Tree::Empty),
r: Box::new(Tree::Empty),
}
}
}
答案 2 :(得分:2)
使用key: T
,您明确要求输入T
类型的值。您在初始化(key: None
)中提供的内容是Option<U>
,您需要为其提供一些值,例如将new
更改为
pub fn new(t: T) -> Self {
Tree {
key: t,
l: None,
r: None,
}
}
或者,如果您还希望能够有时拥有密钥,有时却没有密钥,则可以将key
字段更改为键入Option<T>