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

Rust: Is an Enum a subset of Structs?

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

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

像这样:

enum E {
  ONE(String)
}

struct S {
  one: String
}

因此,在内存中,单个变量 struct 和 enum 看起来是一样的。

这是真的还是我遗漏了什么?

实际上恰恰相反:结构是枚举的子集。任何结构都可以表示为 one-variant enum:

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

enum Record { Variant { ... } }
enum TupleLike { Variant(...) }

这个枚举甚至会有相同的 in-memory 表示! (虽然不能保证)。

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

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 } };

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

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