Rust之枚举与模式匹配

枚举类型,简称枚举,允许列举所有可能的值来定义一个类型。

1、定义枚举:

枚举类型:已知所有可能的值,并且所有值的出现是互斥的,即每次只能取一种可能的值,才使用枚举类型。

示例:声明一个枚举

rust 复制代码
enum IpAddrKind{
	V4,
	V6,
}

使用IpAddrKind中的两个变体来创建实例:

rust 复制代码
let four = IpAddrKind::V4;
let six = IpAddrKind::V6;

注:枚举的变体全部处于其标识符的命名空间内,并使用两个冒号将标识符和变体分隔开。

枚举允许直接将其相关联的数据嵌入枚举变体内,这样就可以更简单的表达意思。示例:

rust 复制代码
enum IpAddr{
	V4(String),
	V6(String),
}
let home = IpAddr:V4(String::from("127.0.0.1"));
let loopback = IpAddr::V6(String::from("::1"));

可以直接将数据附加到枚举的每个变体中,这样就不需要额外的使用结构体了。

使用枚举还可以让每个变体拥有不同类型和数量的关联数据。

示例:

rust 复制代码
enum IpAddr{
	V4(u8,u8,u8,u8),
	V6(String),
}
let home = IpAddr::V4(127.0.0.1);
let loopback = IpAddr::V6(String::from("::1"));

2、Option枚举:

在Rust中虽然没有空值的概念,但是却提供了一个拥有类似概念的枚举,可以使用它来标识一个值的无效或缺失。这个枚举就是Option<T>,它在标准库中的定义如下:

rust 复制代码
enum Option<T>{
	Some(T),
	None,
}

这里的<T>表示一种泛型,即可以指代任意类型的数据。

因为Option<T>T(T表示任意数据类型)是不同的类型,因此编译器不允许像使用普通值一样去直接使用Option<T>的值。

3、控制流运算符match:

Rust中存在一个控制流运算符:match,它允许将一个值与一系列的模式相比较,并根据匹配的模式执行相应的代码。模式可以由字面量、变量名、通配符和其他组成。

示例:

rust 复制代码
enum Coin {
	Penny,
	Nickel,
	Dime,
	Quarter,
}
fn value_in_cents(coin:Coin) -> u32{
	match coin{
		Coin::Penny => 1,
		Coin::Nickel => 5,
		Coin::Dime => 10,
		Coin::Quarter => 25,
	}
}

使用match进行匹配时,必须穷举所有的可能,来确保代码的合法性。

4、_通配符:

当不需要处理所有可能的值的时候,可以使用_通配符去匹配其余值。

示例:

rust 复制代码
let some_u8_value = 0u8;
match some_u8_value{
	1 => println!("one"),
	3 => println!("three"),
	5 => println!("five"),
	_ => (),
}

这里的_可以匹配任何值,将_放在其他分支后面,可以帮助匹配所有没有被显式指定出来的情形。

5、简单控制流if let

if let能够用来处理只关心某一种匹配而忽略其他匹配的情况。

示例:

使用match进行匹配:

rust 复制代码
let some_u8_value = Some(0u8);
match some_u8_value{
	Some(3) => println!("three"),
	_ => (),
}

使用if let进行改写:

rust 复制代码
let some_u8_value = Some(0u8);
if let Some(3) = some_u8_value{
	println!("three"),
}
相关推荐
木木em哈哈9 小时前
有关于cnb自动化的脚本补全
服务器·开发语言·pygame
星释9 小时前
Rust 练习册 :Poker与扑克牌游戏
开发语言·游戏·rust
晨非辰9 小时前
【数据结构初阶】--从排序算法原理分析到代码实现操作,参透插入排序的奥秘!
c语言·开发语言·数据结构·c++·算法·面试·排序算法
Jonathan Star9 小时前
Next.js、NestJS、Nuxt.js 是 **Node.js 生态中针对不同场景的框架**
开发语言·javascript·node.js
zhangyao94033012 小时前
关于js导入Excel时,Excel的(年/月/日)日期是五位数字的问题。以及对Excel日期存在的错误的分析和处理。
开发语言·javascript·excel
骑驴看星星a12 小时前
【Three.js--manual script】4.光照
android·开发语言·javascript
2301_7951672013 小时前
玩转Rust高级应用 如何避免对空指针做“解引用”操作,在C/C++ 里面就是未定义行为
c语言·c++·rust
星释13 小时前
Rust 练习册 :Leap与日期计算
开发语言·后端·rust
悟能不能悟15 小时前
java的java.sql.Date和java.util.Date的区别,应该怎么使用
java·开发语言
循环过三天15 小时前
3.4、Python-集合
开发语言·笔记·python·学习·算法