枚举(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")按字符串名解析,需按错误流消费,失败走 failSystem.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)注意
最后更新于 2026年10月9日
