Rust:枚举是结构的子集吗?

dip*_*ppa 1 enums struct rust

我刚刚了解到可以使用自定义数据类型来初始化枚举。

这不会使枚举成为结构的子集吗?Enum 可以是具有单个未命名变量的结构,该变量初始化一次且无法更改(如 Java 中的 Final 变量)。此外,没有方法可以实现到枚举。

像这样:

enum E {
  ONE(String)
}

struct S {
  one: String
}
Run Code Online (Sandbox Code Playgroud)

因此,在内存中,单个变量结构和枚举看起来是相同的。

这是真的还是我错过了什么?

Cha*_*man 5

实际上恰恰相反:结构是枚举的子集。任何结构都可以表示为单变体枚举:

struct Record { ... }
struct TupleLike(...);

enum Record { Variant { ... } }
enum TupleLike { Variant(...) }
Run Code Online (Sandbox Code Playgroud)

该枚举甚至将具有相同的内存表示!(尽管不能保证)。

另一方面,具有多种变体的枚举不能被精确地描述为结构体。它们通常作为标记联合来实现,例如:

enum E {
    S(String),
    I(i32),
}
E::I(123);

type E_Discriminant = u8;
const E_S: E_Discriminant = 0;
const E_I: E_Discriminant = 1;
union E_Payload {
    s: String,
    i: i32,
}
struct E {
    discriminant: E_Discriminant,
    payload: E_Payload,
}
E { discriminant: E_I, payload: E_Payload { i: 123 } };
Run Code Online (Sandbox Code Playgroud)

但即使手动执行此操作也无法为您提供使用枚举的完整语言体验:您将无法使用模式匹配,访问变体将是unsafe(并且危险的)等等。

然而,当只需要一种变体时,结构使用起来更舒服,这就是它们存在的原因。