为什么Rust有struct和enum?

use*_*220 36 rust

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

Mat*_* M. 32

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

但是,这里还有其他元素在起作用.

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

  • 区别:a enum是标记的联合,a struct是固定布局; 我们(程序员)通常喜欢在事物上贴标签,因此可以理解为不同的功能赋予不同的名称.

正如我所看到的,struct因此是语法糖.我通常更喜欢精益和卑鄙,但是一点点糖可以在很大程度上增加可以简洁的代表.

  • `enum` 是否严格优于 `struct`?似乎 `enum` 依赖于 `struct`s 和 `tuple`s,以便为每个变体存储多个元素。我想删除 `struct`s 但保留 `tuple`s 将允许 `enum`s 履行 `struct`s 可以完成的所有角色。 (2认同)
  • @8bittree:您可以在单个变体或元组中存储多个字段,...但您不能*命名*它们。 (2认同)
  • 枚举并不“严格”优于结构,它们是不同的。Lukas Kalbertodt 通过解释枚举“无法构造产品类型”来触及这一点——如果数据类型具有多个需要单独访问的独立组件,则枚举将很麻烦 (2认同)

Man*_*rth 19

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

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

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

如果从Rust中删除了结构,那么就不会丢失功能,可以再次使用带有结构变体的枚举.但是会有大量的单变量枚举,这些枚举使用起来既不必要又麻烦.


Luk*_*odt 7

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

An 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 }
}
Run Code Online (Sandbox Code Playgroud)

因此,如果每个enum变体只与一种类型相关联就足够了.并且在这种情况下enum并不优越struct,因为它无法构建产品类型(如struct).

能够在枚举变体定义中编写"类型定义"只是为了方便起见.

另外:struct也优于"元组结构"和"元组".如果我们忽略名称那么这三件事几乎是等价的.但Rust为方便起见仍然有这三种不同的类型.


请注意,我不知道这些枚举定义是否实际上是语法糖.但它们可能是,这可能有助于思考.它