仓颉模式匹配
模式匹配是仓颉的核心特性之一,提供了比传统 switch 更强大的分支匹配能力。match 表达式可以匹配常量、类型、枚举、元组等多种模式。
match 表达式基础
match 表达式的结构:
match (value) {
case pattern1 => expression1
case pattern2 => expression2
case _ => defaultExpression
}
case _ 是通配符模式,匹配任何值,通常放在最后作为默认分支。
常量模式
匹配具体的常量值:
let level = "B"
match (level) {
case "A" => println("优秀")
case "B" => println("良好")
case "C" => println("一般")
case _ => println("其他")
}
绑定模式
将匹配的值绑定到变量:
let value = 42
match (value) {
case 0 => println("零")
case n => println("非零:${n}") // n 绑定为 42
}
枚举模式
匹配枚举的不同构造器,并提取参数:
enum Shape {
| Circle(Float64)
| Rectangle(Float64, Float64)
| Triangle(Float64, Float64, Float64)
}
func area(shape: Shape): Float64 {
match (shape) {
case Circle(r) => 3.14159 * r * r
case Rectangle(w, h) => w * h
case Triangle(a, b, c) => {
let s = (a + b + c) / 2.0
(s * (s - a) * (s - b) * (s - c)) ** 0.5
}
}
}元组模式
匹配元组的结构并解构:
let point = (0, 5)
match (point) {
case (0, 0) => println("原点")
case (0, y) => println("Y轴上,y = ${y}")
case (x, 0) => println("X轴上,x = ${x}")
case (x, y) => println("坐标(${x}, ${y})")
}
类型模式
根据值的类型进行匹配:
func describe(value: Any): String {
match (value) {
case n: Int64 => "整数:${n}"
case s: String => "字符串:${s}"
case b: Bool => "布尔:${b}"
case _ => "未知类型"
}
}
Option 模式匹配
match 是处理 Option<T> 的标准方式:
func showOption(opt: Option<Int64>): Unit {
match (opt) {
case Some(value) => println("值为 ${value}")
case None => println("无值")
}
}
守卫条件
使用 where 为模式添加额外条件:
match (score) {
case s where s >= 90 => "优秀"
case s where s >= 80 => "良好"
case s where s >= 60 => "及格"
case _ => "不及格"
}
嵌套模式
模式可以嵌套使用:
enum Expr {
| Num(Float64)
| Add(Expr, Expr)
| Mul(Expr, Expr)
}
func eval(expr: Expr): Float64 {
match (expr) {
case Num(n) => n
case Add(e1, e2) => eval(e1) + eval(e2)
case Mul(e1, e2) => eval(e1) * eval(e2)
}
}本章小结
match是仓颉的核心模式匹配机制,功能远超 switch。- 支持常量模式、绑定模式、枚举模式、元组模式、类型模式。
- 使用
where添加守卫条件。 Option<T>使用Some/None模式匹配处理。- 模式可以嵌套组合使用。