!##仓颉##
在编程语言中,模式匹配不仅限于 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)仅允许在 match 或 if let 中使用,它们能处理匹配失败的分支。
通过合理利用不可反驳模式,可显著提升代码的简洁性和表达力,尤其在解构复杂数据时。
!##仓颉##
浙公网安备 33010602011771号