我看到了这段代码:
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
fn main() {}
看起来代码的作者在枚举内部定义了结构。正确的术语是什么?这是如何运作的?有没有办法将预定义的结构放入枚举中?
struct Run { distance: i32 }
enum Message {
Run, // already defined so we just write Run instead of Run { distance: i32 }
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
fn main() {}
我想这不会起作用,那么我应该做什么呢?
完全做您想要做的事情;但你可以接近:
struct Run { distance: i32 }
enum Message {
Run(Run),
Quit,
}
fn main() {
let m = Message::Run(Run { distance: 32 });
}
在本例中,您有一个 struct Run
以及一个
Message::Run
,其中包含一个恰好是
struct Run
的值。
该数据可以是结构体或元组(这基本上只是结构体的简单形式),它的类型是
Enum::Variant
。在第二个示例中,类型 Message::Run 与 crate 根处的 Run 类型不同,因此 rustc 不会使用 crate::Run 作为 Message::Run 的类型。要正确执行此操作,您可以像第一个示例中那样声明 Run in line 或制作您的变体
Run(Run)
。
Message
枚举没有结构。枚举本身不会创建单独的结构类型,每个变体都可以有自己的一组命名字段。这可以帮助您将相同的
Message
类型分组在一起。这意味着我们可以定义接受
Message
类型值的函数,或者使向量保存
Message
类型。如果您为每个结构创建单独的结构,那么您必须为每个结构实现函数。现在,如果你想打印
Message
类型,你可以写
fn print_message(message:Message){
println!("{:#?}",message);
}
这种方法无需创建单独的结构并为每个结构实现函数。通过使用具有类似结构体变体的枚举,您可以编写更简洁、更灵活的代码。