0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Rust的 match 语句用法

科技绿洲 来源:TinyZ 作者:TinyZ 2023-09-19 17:08 次阅读

Rust 是一门现代化的系统编程语言,它拥有高性能、内存安全和并发性等特点。Rust 的语法设计非常优秀,其中 match 语句是一种非常强大的语言特性。match 语句可以让我们根据不同的匹配模式执行不同的代码,这在处理复杂的逻辑时非常有用。在本教程中,我们将深入了解 Rust 的 match 语句,包括基础用法、进阶用法和实践经验等方面。

基础用法

match 语句是 Rust 中的一种控制流语句,它可以让我们根据不同的模式匹配执行不同的代码。match 语句的基本语法如下:

match value {
    pattern1 = > {
    // code1
    }
    pattern2 = > {
    // code2
    }
    _ = > {
    // 没有任何匹配
    }
}

其中,value 是要匹配的变量,pattern 是匹配模式,=>后面是要执行的代码块。如果 value 匹配了某个模式,就会执行对应的代码块。如果 value 没有匹配任何模式,就会执行默认的代码块(即_ => {...})。

接下来,我们将通过一些示例来介绍 match 语句的基础用法。

匹配整数

let x = 1;

match x {
    1 = > println!("x is one"),
    2 = > println!("x is two"),
    _ = > println!("x is not one or two"),
}

在这个示例中,我们定义了一个整数变量 x,并使用 match 语句匹配它。如果 x 等于 1,就会执行第一个代码块,输出"x is one";如果 x 等于 2,就会执行第二个代码块,输出"x is two";如果 x 不等于 1 或 2,就会执行默认的代码块,输出"x is not one or two"。

匹配枚举类型

enum Color {
    Red,
    Green,
    Blue,
}

let color = Color::Green;

match color {
    Color::Red = > println!("The color is red"),
    Color::Green = > println!("The color is green"),
    Color::Blue = > println!("The color is blue"),
}

在这个示例中,我们定义了一个枚举类型 Color,并将变量 color 赋值为 Color::Green。然后,我们使用 match 语句匹配 color。如果 color 等于 Color::Red,就会执行第一个代码块,输出"The color is red";如果 color 等于 Color::Green,就会执行第二个代码块,输出"The color is green";如果 color 等于 Color::Blue,就会执行第三个代码块,输出"The color is blue"。

匹配元组

let point = (1, 2);

match point {
    (0, 0) = > println!("The point is at the origin"),
    (_, 0) = > println!("The point is on the x-axis"),
    (0, _) = > println!("The point is on the y-axis"),
    (x, y) = > println!("The point is at ({}, {})", x, y),
}

在这个示例中,我们定义了一个元组变量 point,并使用 match 语句匹配它。如果 point 等于(0, 0),就会执行第一个代码块,输出"The point is at the origin";如果 point 的第二个元素等于 0,就会执行第二个代码块,输出"The point is on the x-axis";如果 point 的第一个元素等于 0,就会执行第三个代码块,输出"The point is on the y-axis";否则,就会执行第四个代码块,输出"The point is at ({}, {})"。

匹配范围

let age = 20;

match age {
    0..=17 = > println!("You are a minor"),
    18..=64 = > println!("You are an adult"),
    _ = > println!("You are a senior"),
}

在这个示例中,我们定义了一个整数变量 age,并使用 match 语句匹配它。如果 age 的值在 0 到 17 之间,就会执行第一个代码块,输出"You are a minor";如果 age 的值在 18 到 64 之间,就会执行第二个代码块,输出"You are an adult";否则,就会执行默认的代码块,输出"You are a senior"。

匹配引用

let x = 1;
let y = &x;

match y {
    &1 = > println!("The value is one"),
    _ = > println!("The value is not one"),
}

在这个示例中,我们定义了一个整数变量 x 和一个指向 x 的引用 y。然后,我们使用 match 语句匹配 y。由于 y 是一个引用,所以我们需要在模式中使用&符号来匹配它。如果 y 指向的值等于 1,就会执行第一个代码块,输出"The value is one";否则,就会执行默认的代码块,输出"The value is not one"。

匹配守卫

let x = 5;

match x {
    n if n < 0 = > println!("The value is negative"),
    n if n > 10 = > println!("The value is greater than 10"),
    _ = > println!("The value is between 0 and 10"),
}

在这个示例中,我们定义了一个整数变量 x,并使用 match 语句匹配它。在模式中,我们使用 if 语句添加了一个守卫条件。如果 x 小于 0,就会执行第一个代码块,输出"The value is negative";如果 x 大于 10,就会执行第二个代码块,输出"The value is greater than 10";否则,就会执行默认的代码块,输出"The value is between 0 and 10"。

进阶用法

除了上面介绍的基础用法,match 语句还有一些进阶用法,可以让我们更加灵活地使用它。接下来,我们将介绍 match 语句的一些进阶用法,并通过示例来演示它们的用法。

使用|匹配多个模式

let x = 1;

match x {
    1 | 2 = > println!("The value is one or two"),
    _ = > println!("The value is not one or two"),
}

在这个示例中,我们定义了一个整数变量 x,并使用 match 语句匹配它。在模式中,我们使用|符号来匹配多个模式。如果 x 等于 1 或 2,就会执行第一个代码块,输出"The value is one or two";否则,就会执行默认的代码块,输出"The value is not one or two"。

使用..=匹配范围

let age = 20;

match age {
    0..=17 = > println!("You are a minor"),
    18..=64 = > println!("You are an adult"),
    _ = > println!("You are a senior"),
}

在这个示例中,我们定义了一个整数变量 age,并使用 match 语句匹配它。在模式中,我们使用..=符号来匹配范围。如果 age 的值在 0 到 17 之间,就会执行第一个代码块,输出"You are a minor";如果 age 的值在 18 到 64 之间,就会执行第二个代码块,输出"You are an adult";否则,就会执行默认的代码块,输出"You are a senior"。

使用@绑定变量

let x = Some(5);

match x {
    Some(n @ 1..=10) = > println!("The value is between 1 and 10: {}", n),
    Some(n @ 11..=20) = > println!("The value is between 11 and 20: {}", n),
    Some(_) = > println!("The value is not between 1 and 20"),
    None = > (),
}

在这个示例中,我们定义了一个 Option 类型的变量 x,并使用 match 语句匹配它。在模式中,我们使用@符号来绑定一个变量。如果 x 是一个 Some 类型,并且它的值在 1 到 10 之间,就会执行第一个代码块,输出"The value is between 1 and 10";如果 x 是一个 Some 类型,并且它的值在 11 到 20 之间,就会执行第二个代码块,输出"The value is between 11 and 20";如果 x 是一个 Some 类型,但它的值不在 1 到 20 之间,就会执行第三个代码块,输出"The value is not between 1 and 20";如果 x 是一个 None 类型,就不会执行任何代码。

使用_忽略模式

let x = Some(5);

match x {
    Some(_) = > println!("The value is some"),
    None = > println!("The value is none"),
}

在这个示例中,我们定义了一个 Option 类型的变量 x,并使用 match 语句匹配它。在模式中,我们使用_符号来忽略模式。如果 x 是一个 Some 类型,就会执行第一个代码块,输出"The value is some";如果 x 是一个 None 类型,就会执行第二个代码块,输出"The value is none"。

使用 if let 简化模式匹配

let x = Some(5);

if let Some(n) = x {
    println!("The value is {}", n);
} else {
    println!("The value is None");
}

在这个示例中,我们定义了一个 Option 类型的变量 x,并使用 if let 语句匹配它。如果 x 是一个 Some 类型,就会执行 if 语句块,输出"The value is x";如果 x 是一个 None 类型,就会执行 else 语句块,输出"The value is None"。使用 if let 语句可以简化模式匹配的代码,使代码更加清晰和简洁。

使用 while let 遍历迭代器

let mut v = vec![1, 2, 3];
while let Some(n) = v.pop() {
    println!("{}", n);
}

在这个示例中,我们定义了一个整数数组 v,并使用 while let 语句遍历它的元素。在 while let 语句中,我们使用 pop()方法从数组中依次取出元素,并将它们绑定到变量 n 中。如果数组中还有元素,就会执行 while 语句块,输出元素的值;否则,就会退出 while 循环。使用 while let 语句可以方便地遍历迭代器或者其他可迭代对象。

实践经验

在实际开发中,我们经常需要使用 match 语句来处理复杂的逻辑。以下是一些实践经验,可以帮助我们更好地使用 match 语句。

给每个分支加上花括号

在 match 语句中,每个分支的代码块通常都比较复杂,因此我们应该给每个分支加上花括号,以便更好地阅读和维护代码。例如:

let x = 1;

match x {
    1 = > {
        println!("The value is one");
        println!("This is a long message");
    }
    2 = > {
        println!("The value is two");
    }
    _ = > {
        println!("The value is not one or two");
    }
}

使用_忽略不需要的变量

在 match 语句中,我们可以使用_符号来忽略不需要的变量。这样可以简化代码,并且让代码更加清晰。例如:

let x = (1, 2);

match x {
    (1, _) = > println!("The first element is 1"),
    (_, 2) = > println!("The second element is 2"),
    _ = > (),
}

在这个示例中,我们使用_符号来忽略第二个元素,因为我们只关心第一个元素是否等于 1。

使用 if let 简化模式匹配

在某些情况下,我们只需要匹配一个模式,而不需要处理其他模式。此时,我们可以使用 if let 语句来简化模式匹配的代码。例如:

let x = Some(5);

if let Some(n) = x {
    println!("The value is {}", n);
}

在这个示例中,我们只需要匹配 Some 类型的值,而不需要处理 None 类型的值。因此,使用 if let 语句可以让代码更加简洁和清晰。

使用 while let 遍历迭代器

在遍历迭代器时,我们可以使用 while let 语句来依次取出元素,并进行处理。例如:

fn main() {
    let v = vec![1, 2, 3];

    for n in &v {
        println!("{}", n);
    }

    let mut v = vec![1, 2, 3];
    while let Some(n) = v.pop() {
        println!("{}", n);
    }
}

在这个示例中,我们使用 for 循环和 while let 语句来遍历整数数组 v 的元素。使用 while let 语句可以让代码更加简洁和清晰。

总结

match 语句是 Rust 中非常强大的语言特性,它可以让我们根据不同的匹配模式执行不同的代码。在本教程中,我们介绍了 match 语句的基础用法、进阶用法和实践经验等方面。通过学习本教程,相信读者已经掌握了 match 语句的基本用法,并能够在实际开发中灵活运用它。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程语言
    +关注

    关注

    9

    文章

    1878

    浏览量

    33108
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66771
  • 变量
    +关注

    关注

    0

    文章

    595

    浏览量

    28112
  • Rust
    +关注

    关注

    1

    文章

    223

    浏览量

    6387
收藏 人收藏

    评论

    相关推荐

    SQLx在Rust语言中的基础用法和进阶用法

    SQLx是一个Rust语言的异步SQL执行库,它支持多种数据库,包括MySQL、PostgreSQL、SQLite等。本教程将以MySQL数据库为例,介绍SQLx在Rust语言中的基础用法和进阶
    的头像 发表于 09-19 14:32 3060次阅读

    SeaORM的基础用法

    可读性。 在本教程中,我们将介绍SeaORM的基本用法和进阶用法。我们将使用SQLite数据库来演示这些用法。 基础用法 在使用SeaORM之前,我们需要将其添加到我们的
    的头像 发表于 09-19 14:37 1422次阅读

    基于Rust语言Hash特征的基础用法和进阶用法

    ,包括Hash trait、HashMap、HashSet等,本教程将详细介绍Rust语言Hash特征的基础用法和进阶用法。 基础用法 使用Hash trait 在
    的头像 发表于 09-19 16:02 737次阅读

    如何在Rust中使用Memcached

    了Memcached协议的实现,使得开发者可以在Rust中使用Memcached。 基础用法 创建连接 使用Rust语言Memcached需要先创建一个连接。可以使用 memcached::Client
    的头像 发表于 09-19 16:30 882次阅读

    Rust GUI实践之Rust-Qt模块

    Rust-Qt 是 Rust 语言的一个 Qt 绑定库,它允许 Rust 开发者使用 Qt 框架来创建跨平台的图形界面应用程序。Qt 是一个跨平台的应用程序框架,它提供了一系列的工具和库,可以帮助
    的头像 发表于 09-30 16:43 964次阅读

    Rust语言如何与 InfluxDB 集成

    的数据处理和存储能力。 本教程将介绍 Rust 语言如何与 InfluxDB 集成,包括基础用法和进阶用法和完整的示例代码。 基础用法 安装 InfluxDB
    的头像 发表于 09-30 16:45 616次阅读

    如何在Rust中读写文件

    见的内存安全问题和数据竞争问题。 在Rust中,读写文件是一项非常常见的任务。本教程将介绍如何在Rust中读写文件,包括基础用法和进阶用法。 基础
    的头像 发表于 09-20 10:57 1191次阅读

    求助if 语句用法

    查了 if 相关嵌套的用法 好像没有下面这样用的语句
    发表于 08-19 15:49

    verilog中generate语句用法分享

    不同的赋值语句或者逻辑语句,如果在参数量很大的的情况下,原本的列举就会显得心有余而力不足。c语言中常用for语句来解决此类问题,verilog则为我们提供了generate语句。一 、
    发表于 12-23 16:59

    浅谈C语言goto语句用法

    今天一起来分析C语言,goto语句用法。goto语句用法goto语句,为无条件转移语句。其一
    发表于 05-06 09:16

    generate语句的基本概念与用法

    生成语句(GENERATE)是一种可以建立重复结构或者是在多个模块的表示形式之间进行选择的语句。由于生成语句可以用来产生多个相同的结构,因此使用生成语句就可以避免多段相同结构的VHDL
    的头像 发表于 11-21 07:08 5391次阅读

    SQL的经典语句用法详细说明

    本文档的主要内容详细介绍的是SQL的经典语句用法详细说明资料免费下载
    发表于 10-22 16:11 5次下载

    verilog中的initial语句说明

    解释verilog HDL中的initial语句用法
    发表于 05-31 09:11 0次下载

    Rust语言中r2d2基础用法

    r2d2是Rust语言的一个连接池模块,可以用于管理和复用数据库连接。它可以与多种数据库进行交互,包括MySQL、PostgreSQL、SQLite等等。使用r2d2可以提高数据库操作的效率,避免
    的头像 发表于 09-19 16:25 1375次阅读

    assign语句和always语句用法

    用法和功能。 一、Assign语句 Assign语句的定义和语法 Assign语句用于在HDL中连续赋值,它允许在设计中为信号或变量分配一个值。Assign
    的头像 发表于 02-22 16:24 485次阅读