Generics 如何在Vec中存储具有不同参数的类型?

Generics 如何在Vec中存储具有不同参数的类型?,generics,rust,traits,Generics,Rust,Traits,我试图在Rust中建立一个树结构,但遇到了一个问题,即如何存储节点列表,这些节点存储不同类型的值,因此具有不同的类型参数 问题的简化版本如下: struct Node<T> { pub props: T, pub children: Vec<Node> } fn main() { let node = Node { props: (42, 6), children: vec![Node {

我试图在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![]
        }]
    };
}
struct节点{
酒吧道具:T,
酒吧儿童:Vec
}
fn main(){
让节点=节点{
道具:(42,6),
子节点:vec![Node]{
道具:一些(“土豆”),
儿童: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
error[E0243]:类型参数数量错误:应为1,找到0
-->src/main.rs:4:19
|
4 |儿童:Vec
|^^^^^应为1个类型参数
我不能提供类型参数,因为必须允许它是任何类型。做这件事最好的方法是什么


我已经看过了,但它没有处理类型参数。

如果要存储不同类型的值,首先确定要存储的所有类型的值。 然后定义一个
enum
,如下所示:

enum Value {
    Pair(i32, i32),
    MayBeStr(Option<&'static str>),
    ... // any value that you would like to store
}
枚举值{
对(i32,i32),

MayBeStr(Option到目前为止,我提出的最佳解决方案是在所有项目中添加一个特征,并使用方框存储它们。例如:

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![]
        }]
    };
}
trait Props{}
(i32,i32){}的impl-Props
impl{}
结构节点,

pub children:VecIt似乎隐式地需要第二个类型参数,比如
Q
,这样
Node
的子节点就是
Node
,但是……关联的类型会是答案吗?不会,因为关联的类型是针对traits的……等等。存储不同类型的值,因此具有不同的类型参数。"如果我读的是正确的,除非他们是正确的,否则这不会像Rust一样以静态类型语言出现。请回答你的问题,解释为什么对的答案不能回答你的问题。副本确实解决了你的问题:你的类型参数
t
可以单态化为
节点
。不幸老实说,我没有有限数量的类型来存储,否则我会这样做,但你如何得到值回来?我不确定
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![]
        }]
    };
}