Rust 1.66版本增加了带有字段的枚举类型,用户可以进行值的指定。这是什么意思?让我们看一个例子:1#[repr(u8)]
2enum Bar {
3 A,
4 B,
5 C = 42,
6 D,
7}
在这里,变量A、B、C和D的值分别为0、1、42和43。在Rust 1.65之前的版本,这样是没有问题的。但是如果任何一个变量指定了字段,上面的代码将无法编译-如下所示:1#[repr(u8)]
2enum Foo {
3 A(bool, String) = 100,
4 B,
5 C,
6}
在上面的枚举类型Foo中,变体类型A有两个类型为bool和String的字段,这将导致编译失败。在rust 1.66的最新稳定版本中,非单位类型(即带字段的变体)的显式指定已被放宽。完整代码如下:1use std::mem::discriminant;
2
3#[repr(u8)]
4enum Bar {
5 A,
6 B,
7 C = 42,
8 D,
9}
10
11#[repr(u8)]
12enum Foo {
13 A(bool, String) = 100,
14 B,
15 C,
16}
17
18fn main() {
19 println!("Bar::A discriminant-> {:?}", discriminant(&Bar::A));
20 println!("Bar::B discriminant-> {:?}", discriminant(&Bar::B));
21 println!("Bar::C discriminant-> {:?}", discriminant(&Bar::C));
22 println!("Bar::D discriminant-> {:?}", discriminant(&Bar::D));
23
24 println!("Bar::A discriminant-> {}", Bar::A as u8);
25 println!("Bar::B discriminant-> {}", Bar::B as u8);
26 println!("Bar::C discriminant-> {}", Bar::C as u8);
27 println!("Bar::D discriminant-> {}", Bar::D as u8);
28
29 println!("Foo::A discriminant-> {:?}", discriminant(&Foo::A(true, String::new())));
30 println!("Foo::B discriminant-> {:?}", discriminant(&Foo::B));
31 println!("Foo::C discriminant-> {:?}", discriminant(&Foo::C));
32}
Bar::A discriminant-> Discriminant(0)
Bar::B discriminant-> Discriminant(1)
Bar::C discriminant-> Discriminant(42)
Bar::D discriminant-> Discriminant(43)
Bar::A discriminant-> 0
Bar::B discriminant-> 1
Bar::C discriminant-> 42
Bar::D discriminant-> 43
Foo::A discriminant-> Discriminant(100)
Foo::B discriminant-> Discriminant(101)
Foo::C discriminant-> Discriminant(102)
它有什么帮助?一般来说,开发者不需要直接处理判定值。但是当跨语言边界传递类型时,它很方便,因为枚举类型必须在两个方向上匹配。https://rbsomeg.medium.com/explicit-discriminant-value-for-enum-variants-52cb508ace92