我试图在Rust中设置树结构,但是我遇到了如何存储节点列表的问题,这些节点存储了不同类型的值,因此具有不同的类型参数
问题的简化版本如下:
struct Node<T> {
pub props: T,
pub children: Vec<Node>
}
fn main() {
let node = Node {
props: (42, 6),
children: vec![Node {
props: Some("potatoes"),
children: vec![]
}]
};
}
无法使用以下错误进行编译:
error[E0243]: wrong number of type arguments: expected 1, found 0
--> src/main.rs:4:19
|
4 | children: Vec<Node>
| ^^^^ expected 1 type argument
我无法提供类型参数,因为它必须被允许为任何东西。这样做的最佳方法是什么?
我查看了this question,但它没有解决类型参数。
答案 0 :(得分:0)
如果要存储不同类型的值,请首先确定要存储的所有值类型。
然后定义enum
:
enum Value {
Pair(i32, i32),
MayBeStr(Option<&'static str>),
... // any value that you would like to store
}
然后把它连接起来:
struct Node {
pub props: Value,
pub children: Vec<Node>
}
fn main() {
let node = Node {
props: Value::Pair(42, 6),
children: vec![Node {
props: Value::MayBeStr(Some("potatoes")),
children: vec![]
}]
};
}
答案 1 :(得分:0)
到目前为止,我提出的最佳解决方案是为所有项目添加特征并使用Box来存储它们。对于这个例子:
trait Props {}
impl Props for (i32, i32) {}
impl<'a> Props for Option<&'a str> {}
struct Node<'a> {
pub props: Box<Props + 'a>,
pub children: Vec<Node<'a>>
}
fn main() {
let node = Node {
props: Box::new((42, 6)),
children: vec![Node {
props: Box::new(Some("potatoes")),
children: vec![]
}]
};
}