Skip to content

Switch 语法 ​

switch 对 enum variant、字面量、null 或运行时名义类型进行分支。每个 case 都使用代码块,表达式形式通过 break value 产生结果。

norm
String text = switch token {
    case Number(Double value) { break "number" }
    case Name(String value) { break value }
    case End { break "end" }
}

匹配顺序 ​

被匹配表达式只求值一次。case 按源码顺序测试,首个匹配 case 独占执行;case 之间没有 fallthrough。完整模式规则见模式匹配。

穷尽性 ​

每个 switch 都必须穷尽。编译器根据静态类型与模式递归计算覆盖范围:封闭 enum 必须覆盖全部 variant,nullable 类型必须覆盖 null,无法有限枚举的值域与开放名义类型必须以 _ 覆盖剩余值。遗漏分支是编译错误。

开放类型层次不能静态枚举所有子类,需要显式兜底分支:

norm
String kind = switch shape {
    case Circle circle { break "circle" }
    case _ { break "other" }
}

_ 覆盖当前类型仍未匹配的全部值。已经被前序模式完全覆盖的分支不可达并产生编译错误。

完成规则 ​

语句 switch 的 case 可以正常完成,随后结束整个 switch。表达式 switch 的每条 case 路径若能正常完成,必须执行 break value;return 或 throw 等不正常完成路径不需要产生局部结果。各 break value 的结果必须合并为唯一静态类型。

Norm 0.25