Skip to Content

枚举(Enum)

enum 声明封闭的变体集合。变体可以不带数据,也可以带载荷,配合 match 把互斥情形的结构化分支表达成一等构造。

声明形态

enum Color { Red, Green, Blue, } enum Light { Off, Blink(times: int), On(brightness: float), }

Color 是纯标记枚举;Light 的变体带位置载荷(具名 times: int 或裸类型均可,同一枚举内风格须统一)。泛型枚举 enum Opt<T> { Some(T), None } 同样合法。

构造与反射面

val c = Color.Green; print(c, c.name, c.ToString()); print(Color.Blue); val variants = Color.Variants(); print(variants.Count); val parsed = try? Color("Blue"); print(parsed ?? Color.Red); val bad = try? Color("紫"); print(bad == null);
Green Green Green Blue 3 Blue True
  • 静态名就是构造器:Color.Green 直接得到值。
  • Variants() 返回全部变体的列表。
  • Color("Green") 按字符串名解析,需按错误流消费,失败走 fail System.ConversionError。有载荷变体的枚举不支持字符串解析。

载荷变体

val l = Light.Blink(3); print(l.ToString()); val brightness = match l { Light.Off => 0.0, Light.Blink(t) => t as float, Light.On(b) => b, }; print(brightness);
Blink(3) 3

带载荷变体的 ToString() 输出 变体名(载荷…) 形。match 解构载荷见匹配一页的穷尽性检查:漏掉任何变体都过不了编译。

泛型枚举

类型参数让载荷泛型化,最典型的就是可选值:

enum Opt<T> { Some(value: T), None, } val o = Opt.Some(5); val n = Opt<string>.None; print(n == Opt<string>.None); val sum = match o { Opt.Some(v) => v, Opt.None => 0, }; print(sum);
True 5

类型实参通常从构造实参推断(Opt.Some(5) 得 Opt<int>)。match 的臂用非泛型限定名 Opt.Some(v),模式里不写类型实参。

打印与 ToString() 显示裸变体名加载荷(Opt.Some(5) 显示 Some(5)),不带类型实参。

is 对枚举类型为 True,泛型实例的 is 按声明身份判、不展开类型实参:Opt.Some(5) is Opt<int> 与 is Opt<string> 都是 True,别拿 is 判别类型实参。

枚举类型参数同样可以带 where 约束,约束面与泛型类型一致:

import Math.*; enum Measure<T> where T: Numeric { Value(v: T), Zero, } val m = Measure.Value(5); print(m);
Value(5)

注意

  • 枚举之间没有隐式整数转换,需要位组合语义请用标志位。
  • 带载荷变体的枚举不支持从 string 转换。
  • 枚举变体匹配的推荐写法是限定名 Light.Blink 而不是裸名,见匹配。
最后更新于 2026年10月9日