首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

30天拿下Rust之模式与模式匹配

概述

Rust语言以其强大的类型系统和所有权模型而著称,而模式与模式匹配则是Rust中一种非常强大且灵活的工具,它允许我们在编译时根据数据的结构进行条件分支处理。在Rust中,模式是一种用于匹配数据的结构,它可以是一个具体的值、一个变量绑定、一个枚举的变体、一个元组、一个结构体或者一个组合模式。模式匹配则是根据数据的结构,将数据与模式进行匹配,并根据匹配的结果执行相应的代码块。

基本模式匹配

基础模式匹配时,可以是常量模式,也可以是变量绑定模式。

在下面的示例代码中,我们有一个常量number,其值为66。我们使用match表达式来检查number的值。第一个模式66是一个常量模式,它直接匹配整数值66。如果number的值是66,则执行对应的代码块。如果number的值不是66,则执行_通配符模式对应的代码块。

接下来,有一个变量some_number,其类型为Option,并且它的值为Some(100)。我们使用match表达式来检查some_number的值。第一个模式Some(x)是一个变量绑定模式,它匹配Option枚举的Some变体,并将Some中的值绑定到变量x上。如果some_number的值是Some(100),则执行对应的代码块,并打印出"value is: 100"。注意:这里的x是一个新的绑定变量,它只在Some(x)这个模式对应的代码块中有效。如果some_number的值是None,则执行None模式对应的代码块。

fn main() {

// 常量模式

let number = 66;

match number {

66 => println!("number is 66"),

_ => println!("something else"),

}

// 变量绑定模式

let some_number = Some(100);

match some_number {

// x在此处作为绑定变量

Some(x) => println!("value is: {}", x),

None => println!("no value"),

}

}

结构体和枚举的模式匹配

当使用match表达式处理结构体时,我们可以指定结构体字段的值来进行匹配。

在下面的示例代码中,match表达式中有两个模式:

Point { x: 0, y: 0 }:这个模式试图匹配一个Point结构体,其中x字段的值为0,y字段的值为0。因为origin的值是Point { x: 66, y: 99 },这个模式不匹配。

Point { x, y }:这个模式是一个通配符模式,它会匹配任何Point结构体,并将x和y字段的值绑定到对应的变量上。因为第一个模式没有匹配成功,所以执行这个模式对应的代码块。

在这个模式对应的代码块中,x和y变量被绑定到了origin的x和y字段的值上,即:x为66,y为99。最后,我们使用println!宏打印出这些值。

struct Point {

x: i32,

y: i32,

}

fn main() {

let origin = Point { x: 66, y: 99 };

match origin {

Point { x: 0, y: 0 } => println!("Origin point"),

Point { x, y } => println!("({}, {})", x, y),

}

}

当使用match表达式处理枚举时,我们可以直接匹配特定的变体。

在下面的示例代码中,match表达式中有三个模式:

Color::Red:匹配Color枚举的Red变体。如果color是Red,将执行此模式对应的代码块,并打印"Color is red"。

Color::Green:匹配Color枚举的Green变体。如果color是Green,将执行此模式对应的代码块,并打印"Color is green"。

Color::Blue(r, g, b):匹配Color枚举的Blue变体,并解构出其关联的值,将RGB三个分量的值分别绑定到变量r、g和b上。如果color是Blue,将执行此模式对应的代码块,并使用println!宏打印出"Color is blue: (r, g, b)",其中r、g和b是具体的RGB值。

因为color被初始化为Color::Blue(0, 255, 0),所以match表达式将匹配Color::Blue(r, g, b)模式,并执行相应的代码块。

enum Color {

Red,

Green,

Blue(u8, u8, u8),

}

fn main() {

let color = Color::Blue(0, 255, 0);

match color {

Color::Red => println!("Color is red"),

Color::Green => println!("Color is green"),

Color::Blue(r, g, b) => println!("Color is blue: ({}, {}, {})", r, g, b),

}

}

_通配符和..剩余模式

_作为通配符匹配任何值,而..则是剩余模式,用来捕获列表、数组或结构体中未显式匹配的部分。

在下面的示例代码中,match表达式中有两个模式:

[first, second, ..]:这是一个解构模式,用于匹配数组或切片。这个模式将数组的第一个元素绑定到变量first,第二个元素绑定到变量second,而..表示匹配并忽略剩余的所有元素。

_:这是一个通配符模式,用于匹配任何未被之前模式匹配的值。如果数组numbers与前面的模式不匹配,就会执行这个模式对应的代码块。

因为numbers数组至少有两个元素,所以它会成功匹配[first, second, ..]模式。因此,first会被绑定到10,second会被绑定到20,然后执行该模式对应的代码块。如果numbers数组的元素少于两个,那么[first, second, ..]模式就不会匹配,而是会执行_模式对应的代码块。

fn main() {

let numbers = [10, 20, 30, 40, 50];

match numbers {

[first, second, ..] => println!("{}, {}", first, second),

_ => println!("other conditions"),

}

}

模式守卫

除了以上的模式匹配,Rust还提供了模式守卫等高级功能。模式守卫允许我们在匹配模式时附加一个条件,只有当条件为真时,模式才匹配成功。模式守卫写在match分支的模式后面,使用if关键字开头,后面跟着一个布尔表达式。

在下面的示例代码中,我们匹配一个元组pair。对于每个模式,我们有一个条件表达式,它必须为true才能使相应的分支被执行。第一个分支检查x和y是否都大于0,第二个分支检查x是否大于0。如果两个条件都不满足,则执行最后一个分支。

fn main() {

let pair = (66, -99);

match pair {

(x, y) if x > 0 && y > 0 => println!("both are positive: {} and {}", x, y),

(x, y) if x > 0 => println!("only x is positive: {}", x),

_ => println!("neither is positive"),

}

}

总结

Rust中的模式匹配功能强大且灵活,它极大地提高了代码的表达力和可读性,让开发者能够优雅地处理各种复杂的数据结构和条件分支。通过熟练掌握模式匹配,我们可以编写出更为简洁、高效和安全的Rust代码。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OCQUFTkZUEZ8FyRMU85HA6MA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券