Rust的枚举是代数数据类型。据我所知,这似乎包含了什么结构。有必要保留它的结构有什么不同?
答案 0 :(得分:29)
首先,你是正确的,语义enum
严格优于struct
至于它可以代表什么,因此struct
有点多余。
但是,这里还有其他要素。
易用性:enum
中的值只能通过匹配(直接)访问;与访问struct
字段的易用性形成对比。你可以为每个字段编写访问器,但这真的很麻烦。
区别:enum
是标记的联合,struct
具有固定布局;我们(程序员)通常喜欢在标签上添加标签,因此可以欣赏不同功能的不同名称。
据我所知,struct
因此是句法糖。我通常更喜欢精益和卑鄙,但是一点点糖可以在很大程度上增加可以简洁地代表的东西。
答案 1 :(得分:17)
首先,Rust有各种各样的数据类型:
struct Foo {bar: uint}
)struct Foo(pub Bar, Baz)
)struct Foo;
)None
)Some(T)
)Some { pub inner :T }
)这为程序员提供了定义数据类型的一些灵活性。通常,您不需要命名字段,尤其是在struct / variant只有一个字段的情况下。在这种情况下,Rust允许你使用元组结构/元组变体。
如果从Rust中删除了结构,则不会丢失功能,可以再次使用带有struct变体的枚举。但是会有大量的单变量枚举使用它们是不必要和繁琐的。
答案 2 :(得分:6)
不是100%正确,但另一种好的方式来考虑它:enum
实际上并不优于struct
,语法糖只是让它看起来像它。
enum
是一种和型,意味着它的值是一组其他类型之一的一个值。 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 }
}
因此,如果每个enum
变体只与一种类型相关联就足够了。在这种情况下,enum
并不优于struct
,因为它无法构建产品类型(例如struct
)。
能够写出&#34;类型定义&#34;枚举变体定义内部只是为了方便起见。
另外:struct
优于&#34;元组结构&#34;和&#34;元组&#34;也是。如果我们忽略这三个名称nearly等同于名称的名称。但是为了方便起见,Rust仍然有这三种不同的类型。
请注意,我不知道这些枚举定义是否实际上是语法糖。但他们可以,这可能有助于思考。它
答案 3 :(得分:2)
没有找到可能是暂时性的实施细节的原因(我不在核心团队中,没有洞察力),但是