Rust 什么';创建不同结构的向量的通常方法是什么?

Rust 什么';创建不同结构的向量的通常方法是什么?,rust,Rust,我想要一个不同类型结构的集合 Vec不起作用,我认为这是因为不同的结构是不同的类型,而Vec只能包含一种类型 struct Santa { color: String, phrase: String, } struct Rudolph { speed: u32, lumens: u32, } fn newSanta() -> Santa { Santa { color: String::from("Red"), ph

我想要一个不同类型结构的集合

Vec
不起作用,我认为这是因为不同的结构是不同的类型,而
Vec
只能包含一种类型

struct Santa {
    color: String,
    phrase: String,
}
struct Rudolph {
    speed: u32,
    lumens: u32,
}

fn newSanta() -> Santa {
    Santa {
        color: String::from("Red"),
        phrase: String::from("Ho ho ho!"),
    }
}
fn newRudolph() -> Rudolph {
    Rudolph {
        speed: 100,
        lumens: 500,
    }
}

fn main() {
    let santa = newSanta();
    let rudolph = newRudolph();

    let northerners = vec![santa, rudolph]; //fails
}


通常的方法是创建一个
enum
,为每种结构创建一个变量。在处理它们时,需要对它们的枚举变量进行
匹配
,以确定它们的类型

struct Santa {
    color: String,
    phrase: String,
}
struct Rudolph {
    speed: u32,
    lumens: u32,
}

fn newSanta() -> Santa {
    Santa {
        color: String::from("Red"),
        phrase: String::from("Ho ho ho!"),
    }
}
fn newRudolph() -> Rudolph {
    Rudolph {
        speed: 100,
        lumens: 500,
    }
}

enum Common {
  Santa(Santa),
  Rudolph(Rudolph),
}

fn main() {
    let santa = newSanta();
    let rudolph = newRudolph();

    let northerners = vec![Common::Santa(santa), Common::Rudolph(rudolph)];

    match &northerners[0] {
        Common::Santa(santa) => println!("santa color: {}", santa.color),
        Common::Rudolph(rudolph) => println!("rudolph speed: {}", rudolph.speed),
    }
}

或者,如果它们都实现了一个共同的特性,您可以存储其中的一个

struct Santa {
    color: String,
    phrase: String,
}
struct Rudolph {
    speed: u32,
    lumens: u32,
}

fn newSanta() -> Santa {
    Santa {
        color: String::from("Red"),
        phrase: String::from("Ho ho ho!"),
    }
}
fn newRudolph() -> Rudolph {
    Rudolph {
        speed: 100,
        lumens: 500,
    }
}

enum Common {
  Santa(Santa),
  Rudolph(Rudolph),
}

fn main() {
    let santa = newSanta();
    let rudolph = newRudolph();

    let northerners = vec![Common::Santa(santa), Common::Rudolph(rudolph)];

    match &northerners[0] {
        Common::Santa(santa) => println!("santa color: {}", santa.color),
        Common::Rudolph(rudolph) => println!("rudolph speed: {}", rudolph.speed),
    }
}