!##仓颉##
在编程语言中,模式匹配不仅限于 match 表达式,还可用于变量定义for-in 循环。但这两处场景有严格限制:仅允许 不可反驳模式(irrefutable patterns)。这类模式总能成功匹配,不会引发错误。允许的类型包括:

  • 通配符模式(_
  • 绑定模式(如 x
  • 不可反驳的元组模式(如 (x, y)
  • 不可反驳的枚举模式(如 Some(value)

以下通过具体示例详解这四种模式的应用。


1. 通配符模式:忽略值

当不需要使用值时,可用 _ 主动忽略。

变量定义示例

fn main() {
    let _ = 100; // 忽略值,后续无法访问
    println!("Value discarded");
}

for-in 循环示例

fn main() {
    for _ in 1..5 { // 忽略迭代元素
        println!("Loop iteration");
    }
}

输出

Loop iteration
Loop iteration
Loop iteration
Loop iteration

关键点_ 表示显式丢弃值,既节省内存,又明确代码意图。


2. 绑定模式:捕获值

将值绑定到变量,是最常用的不可反驳模式。

变量定义示例

fn main() {
    let x = 100; // 绑定值到 x
    println!("x = {}", x);
}

for-in 循环示例

fn main() {
    for i in 1..5 { // 绑定元素到 i
        println!("{}", i);
    }
}

输出

x = 100
1
2
3
4

3. 不可反驳的元组模式:解构元组

直接解构元组,将元素绑定到变量。

变量定义示例

fn main() {
    let (x, y) = (100, 200); // 解构元组
    println!("x = {}, y = {}", x, y);
}

for-in 循环示例

fn main() {
    let pairs = [(1, 2), (3, 4), (5, 6)];
    for (i, j) in pairs.iter() { // 解构元组元素
        println!("Sum = {}", i + j);
    }
}

输出

x = 100, y = 200
Sum = 3
Sum = 7
Sum = 11

注意:元组模式必须完全匹配结构,否则编译失败(如 let (x,) = (1, 2) 无效)。


4. 不可反驳的枚举模式:提取枚举值

适用于单变体枚举或明确变体的场景。

枚举定义

enum RedColor {
    Red(i64), // 单变体枚举
}

变量定义示例

fn main() {
    let RedColor::Red(red) = RedColor::Red(0); // 提取枚举内部值
    println!("red = {}", red);
}

for-in 循环示例

fn main() {
    let colors = [RedColor::Red(10), RedColor::Red(20), RedColor::Red(30)];
    for RedColor::Red(r) in colors.iter() { // 循环中提取值
        println!("r = {}", r);
    }
}

输出

red = 0
r = 10
r = 20
r = 30

限制:若枚举有多个变体(如 Option::None),此模式会因可能匹配失败而编译报错。


为何必须是不可反驳模式?

变量定义和 for-in 循环要求模式必须成功匹配

  • 变量定义如 let pat = expr;pat 可能失败(如 Some(x) = None),会破坏内存安全。
  • for-in 循环需保证每次迭代都能处理元素。

因此,可失败模式(如 Some(x) 匹配 Option)仅允许在 matchif let 中使用,它们能处理匹配失败的分支。

通过合理利用不可反驳模式,可显著提升代码的简洁性和表达力,尤其在解构复杂数据时。

!##仓颉##

posted on 2025-06-29 17:18  xsir01  阅读(2)  评论(0)    收藏  举报