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
(并且很危险)等。
然而,当只需要一种变体时,结构使用起来更舒适,这就是它们存在的原因。
我刚刚了解到可以使用自定义数据类型初始化 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
(并且很危险)等。
然而,当只需要一种变体时,结构使用起来更舒适,这就是它们存在的原因。