我想要不同类型结构的集合。
AVec
不起作用,我认为因为不同的结构是不同的类型,并且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
}
Run Code Online (Sandbox Code Playgroud)
PS C:\Users\anon> rustc xmas.rs
error[E0308]: mismatched types
--> xmas.rs:27:32
|
27 | let northerners = vec![santa, rudolph]; //fails
| ^^^^^^^ expected struct `Santa`, found struct `Rudolph`
|
= note: expected type `Santa`
found type `Rudolph`
Run Code Online (Sandbox Code Playgroud)
通常的方法是enum
为每种结构创建一个变体。当您处理它们时,您需要match
根据它们的枚举变体来确定它们的类型。
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),
}
}
Run Code Online (Sandbox Code Playgroud)
或者,如果它们每个都实现一个共同的特征,您可以存储它们的特征对象。
归档时间: |
|
查看次数: |
2742 次 |
最近记录: |