跳到主要内容

Match 文

介绍

match 语句是将值与多个模式进行比较以执行分支的控制语句。 比起 if / else if 链式语句,使用 match 可以更清晰地表达分支意图。

当前 Wave 的 match语句,不支持直接求值的表达式形式。 即,var x = match (...) { ... } 这样的形式是不能使用的。


基本语法

match (value) {
pattern1 => {
// 执行块
}
pattern2 => {
// 执行块
}
_ => {
// 默认块
}
}

语法规则:

  • 头部使用 match (expr) 形式。
  • 每个 arm 使用 { ... } 的形式。
  • arm 的正文必须是 { ... } 块。
  • arm 之间可以只用换行,也可以用 ,; 作为分隔符。

模式类型

当前支持的模式有以下三种。

  1. 整数字面量模式
0 => { ... }
1 => { ... }
42 => { ... }
  1. 标识符模式
Off => { ... }
On => { ... }

标识符模式用于可被解释为 整数常量 的值,例如 enum variant。

  1. 通配符模式 (_)
_ => { ... }

这是当没有其他模式匹配时执行的默认 arm。


匹配对象类型

根据当前实现,match 的匹配目标值必须是 整数系列/枚举系列。 字符串、浮点数、结构体等不能作为 match 的目标。


例子 1:整数分支

fun classify_num(v: i32) -> i32 {
var result: i32 = -1;

match (v) {
0 => {
result = 10;
}
1 => {
result = 20;
}
_ => {
result = 99;
}
}

return result;
}

例子 2:枚举分支

enum Mode -> i32 {
Off = 0,
On = 1,
Unknown = 2
}

fun classify_mode(m: Mode) -> i32 {
match (m) {
Off => {
return 1;
}
On => {
return 2;
}
_ => {
return 3;
}
}
}

操作规则

  • switch 系列相似,只会执行 匹配的一个 arm
  • 没有自动贯穿。
  • _ arm 最多只能使用一次。
  • 即使没有 _ arm 也是语法上允许的。 (如果没有匹配的 arm,则不执行任何 arm)

注意事项

  1. 禁止重复案例
  • 重复声明相同的案例会导致编译错误。
  1. 禁止重复使用 _
  • 不能声明多个 _ arm。
  1. 必须有 arm 块
  • => 后面必须有 { ... } 块。
  1. 模式必须是常量
  • 标识符模式只能使用可解释为整数常量/枚举变体的值。

总结

Wave的match是优化用于整数/枚举分支的控制语句。 使用=> + 块结构,并可以通过通配符(_)构成默认分支。

随着分支案例的增多,比if / else if更易读,并能更清晰地展现意图。