模式(Pattern)
模式是「值的形状描述」。match 臂、if val、while val、expect、for 迭代变量、解构绑定全部共用同一套模式机器,本页一次列全。
形态总表
| 形态 | 名字 | 说明 |
|---|---|---|
_ | 通配 | 什么都能配,不绑定 |
name | 绑定 | 恒匹配,绑定不可变值 |
val name / var name | 显式绑定 | 分别声明只读 / 可变 |
42 -42 3.14 "lit" 'c' true null | 字面量 | 与被检查对象类别须一致 |
1..=10 | 范围 | lo..hi 半开、lo..=hi 闭,界可省一侧 |
A | B | 或 | 各分支绑定集须一致(MS4005) |
A & B | 与 | 两个模式都命中 |
Type(p1, p2) | 类型(位置载荷) | 测试类型并按位解构 |
Type { field: p, field2, .. } | 类型(命名载荷) | 简写 field2 等价 field2: field2;.. 忽略余字段 |
name @ pattern | 子绑定 | 整值绑进 name,同时按内层模式匹配 |
(p1, p2) | 元组 | 按位解构 |
[a, b] | 列表(前缀) | 长度必须恰好相等 |
[x, ..rest] | 列表(剩余) | rest 绑定剩余元素的拷贝数组 |
[x, ..] / [..] / [] | 列表(忽略/任意/空) | 见下文 |
Pkg::Mod.Type(...) | 限定类型 | 同包或跨包限定类型 |
{ kind: 1, hp: h, .. } | 匿名记录 | 被检查对象须是 data 值(MS3271) |
字面量、范围与或
for n in [5, 42, 95, 300]
{
print(n, match n
{
5 | 42 => "答案或五",
90..=100 => "九十分档",
v @ 101..=299 => $"中段 {v}",
_ => "其余",
});
}5 答案或五
42 答案或五
95 九十分档
300 其余v @ 101..=299 把整个值绑进 v,同时要求落在范围内。或模式两边都不能带绑定(或各自带完全相同的绑定集),否则报 MS4005。
元组
val pair = (1, "甲");
match pair
{
(n, s) => print($"{n} 号 {s}"),
}
val (m, tag) = pair;
print(m, tag);1 号 甲
1 甲解构绑定 val (a, b) = expr 是模式在 match 之外的第一个应用,等号左边就是模式。
any 通道里的元组值支持类型形判形:if e is (int, string) p 在运行期按分量个数加逐元素递归判定,命中时 p 绑定元组值,形状不符静默为 False。嵌套形状与可空元素((int?, string) 对 null 命中)同样参与。
var e: any = (1, "甲");
if e is (int, string) p
{
print(p.Item1);
}甲列表模式
被检查对象限 list<T> 与数组。前缀模式要求长度恰好相等,..rest 把剩余元素绑成一份拷贝数组,.. 单独出现表示「剩余全部忽略」,[] 只配空列表:
func Classify(xs: list<int>) -> string
{
return match xs
{
[] => "空列表",
[only] => $"单元素 {only}",
[a, b] => $"一对 {a} 和 {b}",
[first, ..rest] => $"首位 {first},还有 {rest.Count} 个",
_ => "兜底",
};
}
print(Classify(new list<int>()));
print(Classify([7]));
print(Classify([1, 2]));
print(Classify([1, 5, 9, 12]));空列表
单元素 7
一对 1 和 2
首位 1,还有 3 个rest是独立拷贝数组:绑定时拷贝剩余元素,对rest[i]的写只改这份拷贝,原列表不受影响,原列表后续变异也不反映进 rest。..只能出现在末元素位,中间带..的形式[a, .., b]不支持。- 嵌套列表模式(
[[a], ..])合法。 - 列表模式永不判穷尽:
[..]看似匹配任意列表,穷尽性检查不计覆盖,match 仍要_兜底。
解构绑定同样接列表模式:
val xs = [10, 20, 30, 40];
val [head, ..tail] = xs;
print(head, tail);10 [20, 30, 40]注意
- 字面量模式与被检查对象类别不一致报 MS4002(比如 int 值上配
"x"或true),整数字面量可以适配浮点。 - 浮点字面量模式忽略后缀:
0.3、0.3f32、0.3f16同判,按被检查对象宽度舍入后再比。 for的迭代变量位就是模式位,for (k, v) in pairs直接解构。
最后更新于 2026年10月9日
