Skip to Content

模式(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日