为什么Rust有struct和enum?

时间:2014-10-18 06:40:51

标签: rust

Rust的枚举是代数数据类型。据我所知,这似乎包含了什么结构。有必要保留它的结构有什么不同?

4 个答案:

答案 0 :(得分:29)

首先,你是正确的,语义enum严格优于struct至于它可以代表什么,因此struct有点多余。

但是,这里还有其他要素。

  • 易用性:enum中的值只能通过匹配(直接)访问;与访问struct字段的易用性形成对比。你可以为每个字段编写访问器,但这真的很麻烦。

  • 区别:enum是标记的联合,struct具有固定布局;我们(程序员)通常喜欢在标签上添加标签,因此可以欣赏不同功能的不同名称。

据我所知,struct因此是句法糖。我通常更喜欢精益和卑鄙,但是一点点糖可以在很大程度上增加可以简洁地代表的东西。

答案 1 :(得分:17)

首先,Rust有各种各样的数据类型:

  • 带有命名字段(struct Foo {bar: uint}
  • 的结构
  • 元组结构(struct Foo(pub Bar, Baz)
  • 没有字段(struct Foo;
  • 的结构
  • Enums,有各种类型的变体:
    • 没有字段的变体(例如None
    • 元组变体(例如Some(T)
    • 结构变体(例如Some { pub inner :T }

这为程序员提供了定义数据类型的一些灵活性。通常,您不需要命名字段,尤其是在struct / variant只有一个字段的情况下。在这种情况下,Rust允许你使用元组结构/元组变体。

如果从Rust中删除了结构,则不会丢失功能,可以再次使用带有struct变体的枚举。但是会有大量的单变量枚举使用它们是不必要和繁琐的。

答案 2 :(得分:6)

不是100%正确,但另一种好的方式来考虑它:enum实际上并不优于struct,语法糖只是让它看起来像它。

enum是一种和型,意味着它的值是一组其他类型之一的一个值。 Result<T, E>类型 属于TE。因此,每个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)

可见度

没有找到可能是暂时性的实施细节的原因(我不在核心团队中,没有洞察力),但是

  • 公共枚举不能包含或包含私有结构。
  • 公共结构可以容纳或包含一个私有枚举。

另请参见