rust学习-3.2-控制语句-模式匹配

模式匹配是Rust语言中一个非常核心的特性,它允许你将值与一系列模式进行比较,并根据模式来执行不同的代码块。Rust中的模式匹配通常与 match 表达式一起使用。

match 表达式

match 表达式是Rust中最常见的模式匹配形式。它将一个值与一系列的模式进行比较,并为每个模式执行相应的代码块。match 表达式的一般形式如下:

match value {
    pattern1 => expression1,
    pattern2 => expression2,
    // ...
    _ => default_expression,
}
  • value 是要匹配的值。
  • pattern1, pattern2, ... 是要与之比较的模式。
  • expression1, expression2, ... 是当模式匹配时执行的表达式。
  • _是一个特殊的模式,它匹配任何值。它类似于其他语言中switch语句的default` 分支。

在Rust中,基础类型的模式匹配通常涉及字面量模式、变量模式和通配符模式。

字面量模式

字面量模式直接匹配一个具体的值。

fn main() {
    let number = 42;
    match number {
        1 => println!("One"),
        42 => println!("The answer to life, the universe, and everything"),
        _ => println!("Some other number"),
    }
}

在这个例子中,match 表达式会检查 number 变量是否等于 142。如果都不匹配,则执行通配符模式 _ 对应的分支。

变量模式

变量模式将匹配的值绑定到一个变量。

fn main() {
    let number = 7;
    match number {
        x => println!("The number is {}", x),
    }
}

这里,无论 number 的值是什么,都会匹配到变量模式 x,并将其绑定到 number 的值。然后打印出来。

通配符模式

通配符模式 _ 匹配任何值,通常用于忽略不关心的值。

fn main() {
    let number = 7;
    match number {
        _ => println!("I don't care about the number"),
    }
}

在这个例子中,无论 number 的值是什么,都会匹配到通配符模式,并执行相应的分支。

范围模式

范围模式(range pattern)是模式匹配中的一种特殊类型,它允许你匹配一个落在特定范围内的值。
范围模式通常用于匹配整数或字符类型的值。当你想要根据一个值是否在某个连续的范围内来执行不同的逻辑时,范围模式特别有用。
这里有一个简单的例子,展示了如何使用范围模式来匹配一个整数值:

fn main() {
    let num = 5;
    match num {
        1..=5 => println!("The number is between 1 and 5"),
        _ => println!("The number is outside the range"),
    }
}

在这个例子中,如果num的值在1到5之间(包括1和5),则第一个模式1..=5会匹配,并打印出相应的信息。如果num的值不在这个范围内,则会匹配到_模式,这是一个通配符模式,它匹配任何值。
范围模式也可以用于if let语句,使得代码更加简洁:

fn main() {
    let num = 3;
    if let 1..=5 = num {
        println!("The number is between 1 and 5");
    } else {
        println!("The number is outside the range");
    }
}

在这个例子中,如果num的值在1到5之间,则if let语句的条件为真,并执行第一个分支的代码。

结合使用

你也可以在 match 表达式中结合使用这些模式。

fn main() {
    let number = 10;
    match number {
        1 => println!("One"),
        2 | 3 | 5 | 7 => println!("This is a prime"),
        10..=20 => println!("Between 10 and 20"),
        _ => println!("Some other number"),
    }
}

在这个例子中,我们使用了字面量模式、或模式(| 运算符)和范围模式(..=)。如果 number1020 之间的任何数,包括 1020,它会匹配第三个分支。
通过这些基础类型的模式匹配,你可以看到Rust中的 match 表达式是多么的灵活和强大。即使是在处理简单的值时,它也能提供清晰和表达力强的代码。

练习题

将if-else练习题改成match实现。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,928评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,748评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,282评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,065评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,101评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,855评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,521评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,414评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,931评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,053评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,191评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,873评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,529评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,074评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,188评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,491评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,173评论 2 357

推荐阅读更多精彩内容