Rust编程的匹配控制语句match

【图书介绍】《Rust编程与项目实战》-****博客

《Rust编程与项目实战》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com)

Rust编程与项目实战_夏天又到了的博客-****博客

学过C语言的同学或许在等switch,明确告诉你们,Rust没有switch,而是提供了功能更加强大的匹配控制语句match。它使我们可以将值与一系列模式进行比较,然后根据匹配的模式执行代码。模式可以由文字值、变量名、通配符和其他内容组成。

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

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

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

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

5.2.1  匹配整数

匹配整数就是让待匹配的值和不同的整数比较,代码如下:

fn main() {
    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"。最终输出结果:x is one。

这个例子是匹配单个值,我们还可以匹配多个值,如果想匹配多个值,不同的值之间用“|”隔开,比如:

fn main() {
    let number = 7;
    match number {
        // 匹配多个值
        2 | 3 | 5 | 7 | 11 => println!("This is a prime"),
        // 要覆盖所有的可能分支,不然有编译错误
        _ => println!("Ain't special"),
    }
}

结果输出:This is a prime。

5.2.2  匹配枚举类型

枚举是一个数据结构,里面可以包含不同的成员元素。匹配枚举就是让待匹配的值和一个枚举中的不同元素进行比较。枚举我们暂时还没学到,这里暂时不用太深究,枚举在日常生活中很常见,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一个枚举。可以认为,枚举是一个有名称的整型常数的集合。

match匹配枚举的代码如下:

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"。

5.2.3  匹配元组

元组可以将其他不同类型的多个值组合进一个复合类型中。元组还拥有一个固定的长度:你无法在声明结束后增加或减少其中的元素数量。通常使用逗号分隔后放置到一对圆括号中创建一个元组。元组每个位置的值都有一个类型,这些类型不需要是相同的。比如我们定义一个元组:

let tuple:(i32,f64,u8) = (-325,4.9,22);

也可以省略类型,比如:

let point = (1, 2);

匹配元组的代码如下:

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 ({}, {})"。

5.2.4  匹配范围

匹配范围和匹配多个值有点类似,但匹配多个值可能是不连续的,而匹配范围则是一段连续的值区间。匹配范围的示例代码如下:

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"。

5.2.5  匹配守卫

匹配守卫(Match Guard)是一个位于 match 分支模式之后的额外 if 条件,它能为分支模式提供进一步的匹配条件。示例代码如下:

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"。

5.2.6  一些经验

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

经验1:给每个分支加上花括号

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

fn main() {
    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");
        }
    }
}

输出结果如下:

The value is one

This is a long message

经验2:使用_忽略不需要的变量

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

let x = (1, 2);

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

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

经验3:使用if let简化模式匹配

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

let x = Some(5);

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

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

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

上一篇:pycharm生成的exe执行后报错


下一篇:Kubernetes(K8s)的简介