在枚举中使用预定义结构

问题描述 投票:0回答:3

我看到了这段代码:

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() {}

我想这不会起作用,那么我应该做什么呢?

rust
3个回答
3
投票
您定义的枚举成员和它们包含的结构或值是不同的,因此您不能

完全做您想要做的事情;但你可以接近:

struct Run { distance: i32 } enum Message { Run(Run), Quit, } fn main() { let m = Message::Run(Run { distance: 32 }); }
在本例中,您有一个 

struct Run

 以及一个 
Message::Run
,其中包含一个恰好是 
struct Run
 的值。


1
投票
枚举变体可以在 Rust 中存储数据。这通常称为求和类型或代数数据类型。

该数据可以是结构体或元组(这基本上只是结构体的简单形式),它的类型是

Enum::Variant

在第二个示例中,类型 Message::Run 与 crate 根处的 Run 类型不同,因此 rustc 不会使用 crate::Run 作为 Message::Run 的类型。要正确执行此操作,您可以像第一个示例中那样声明 Run in line 或制作您的变体

Run(Run)


0
投票

Message

 枚举没有结构。枚举本身不会创建单独的结构类型,每个变体都可以有自己的一组命名字段。这可以帮助您将相同的 
Message
 类型分组在一起。这意味着我们可以定义接受 
Message
 类型值的函数,或者使向量保存 
Message
 类型。

如果您为每个结构创建单独的结构,那么您必须为每个结构实现函数。现在,如果你想打印

Message

 类型,你可以写

fn print_message(message:Message){ println!("{:#?}",message); }
这种方法无需创建单独的结构并为每个结构实现函数。通过使用具有类似结构体变体的枚举,您可以编写更简洁、更灵活的代码。

© www.soinside.com 2019 - 2024. All rights reserved.