模式匹配 - inline-function/Sublimation GitHub Wiki
凝华的 when 是真模式匹配——支持构造子解构、嵌套、守卫、区间模板,且编译器能自动证明穷尽性。
when (x) {
0 -> print("零") // 字面量
n if n > 10 -> print("大数") // 带守卫的变量绑定
else -> print("其他") // 兜底分支
}
when必须穷尽所有可能值,否则编译报W-NON-EXHAUSTIVE。
enum Color { Red; Green; Blue }
when (color) {
Red -> print("红")
Green -> print("绿")
Blue -> print("蓝") // 枚举必然穷尽,不需要 else
}
对 Optional[T] 解构:
when (maybe) {
Some(v) -> print(v) // 绑定 v,作用域在分支内
None -> print("缺值")
}
嵌套构造子:
when (result) {
Ok(Some(v)) -> print(v) // 两层构造子同时解构
Ok(None) -> print("空")
Err(e) -> print("错: " + e)
}
这是凝华的杀手特性:把区间分支交给编译器证明覆盖。
fun grade(score: Nat)<score ∈ (0..100)>: Str {
when(score in _) { // _ = 从上下文推断区间
(0 .. 59) -> return "不及格"
(60 .. 69) -> return "及格"
(70 .. 79) -> return "中等"
(80 .. 89) -> return "良好"
(90 .. 100)-> return "优秀"
}
}
编译器会自动收集每个分支的端点(0, 59, 60, 69, …),排序后检查相邻衔接。这四个分支覆盖了 (0..100),无需 else 也不需要自己写边界检查。
// 有前置条件告知区间:
+∵ score ∈ (0..30)
when(score in _) {
(0 .. 10) -> print("低")
(11 .. 20) -> print("中")
(21 .. 30) -> print("高")
}
when(n in _)的_充当通配符:编译器从 Γ 中的n ∈ (l..r)事实推断区间端点。
没有 subject 的 when 按条件链执行,不需要 else:
when {
n < 0 -> print("负")
n == 0 -> print("零")
n > 0 -> print("正")
}
when (n) {
x if x > 100 && x <= 200 -> print("大") // 多条件守卫
x if x > 0 -> print("正")
else -> print("非正")
}
凝华强制执行穷尽性:每个 when 的 arm 合集必须覆盖所有可能的值。缺失分支报 W-NON-EXHAUSTIVE。
枚举、构造子族、区间 when(n in _)——编译器有专门的穷尽性策略,大多数场景不需要手动写 else。
// ❌ 编译错误:覆盖不完整
when (color) {
Red -> print("红")
}
// → W-NON-EXHAUSTIVE: 缺少 Green, Blue
// ✅ 穷尽
when (color) {
Red -> print("红")
Green -> print("绿")
Blue -> print("蓝")
}