Rust的枚举是代数数据类型。据我所知,这似乎包含了结构体的所有内容。那么,结构体有什么不同之处,需要保留它呢?
Rust的枚举是代数数据类型。据我所知,这似乎包含了结构体的所有内容。那么,结构体有什么不同之处,需要保留它呢?
enum
严格优于struct
,因此struct
有些多余。易用性:在enum
中,只能通过匹配来直接访问值;相比之下,访问struct
字段更容易使用。您可以为每个字段编写访问器,但那确实很麻烦。
区别:一个enum
是一个标记联合,一个struct
具有固定布局;我们(程序员)通常喜欢给事物贴标签,因此赋予不同功能不同名称可能会受到赞赏。
struct
因此成为语法糖。我通常更喜欢精简和高效,但是一点点糖也可以大大增加能够简洁表示的内容。虽然不是百分之百正确,但另一种思考方式是: enum
并不比 struct
更优越,它只是语法糖使其看起来更优秀。
enum
是一种和类型(sum type)表示它的值是一组其他类型中的一个值。例如,Result<T, E>
类型是类型 T
或者类型 E
中的一个。因此,每个 enum
变量都与一个类型相关联。其他所有内容(无类型、元组变量和结构体变量)可能只是语法糖。
enum Animal {
// without syntax sugar
Cat(i32),
// desugars to `Dog(())` (empty tuple/unit)
Dog,
// desugars to `Horse((i32, bool))` (tuple)
Horse(i32, bool),
// desugars to `Eagle(GeneratedEagleType)` and a struct definition outside
// of this enum `struct GeneratedEagleType { weight: i32, male: bool }`
Eagle { weight: i32, male: bool }
}
枚举
变量都与精确一个类型相关联,则足以满足要求。在这种情况下,枚举
不优于结构体
,因为它无法构建产品类型(如结构体
)。结构体
也优于元组结构和元组。如果忽略名称,则这三个事物几乎等价。但是为了方便起见,Rust仍然具有这三种不同类型的类型。不要在可能是瞬时实现细节中寻找原因(我不是核心团队成员,也没有深入了解),但是
除了上面的答案之外,另一个重要的区别是枚举在某一时刻仅可以是所述值之一,而结构体则表示该实例的所有参数的值。 例如:
enum Things{
Box,
Page(i32),
}
struct Things{
box: Option<String>,
page: i32,
}