《Rust语言圣经》Rust教程笔记17:2.Rust基础入门(2.6模式匹配)2.6.2解构Rust Option<T>

文章目录

  • [2. Rust 基础入门](#2. Rust 基础入门)
    • [2.6. 模式匹配](#2.6. 模式匹配)
      • [2.6.2. 解构Option](#2.6.2. 解构Option)
        • [注意不要忘记`Some` 和 `None` 是 `Option` 枚举的成员](#注意不要忘记SomeNoneOption 枚举的成员)
        • [匹配 `Option<T>`](#匹配 Option<T>)
          • [1、传入参数 `Some(5)`](#1、传入参数 Some(5))
          • [2、传入参数 None](#2、传入参数 None)

2. Rust 基础入门

2.6. 模式匹配

2.6.2. 解构Option

在枚举那章,提到过 Option 枚举,它用来解决 Rust 中变量是否有值的问题,定义如下:

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

简单解释就是:一个变量要么有值:Some(T), 要么为空:None

那么现在的问题就是该如何去使用这个 Option 枚举类型,根据我们上一节的经验,可以通过 match 来实现。

注意不要忘记SomeNoneOption 枚举的成员

在 Rust 中,Option 是一个枚举类型,用于表示一个值可能存在也可能不存在的情况。SomeNone 是属于 Option 枚举的两个变体:

  • Some(T):表示存在某个值 T
  • None:表示不存在值。

因为 OptionSomeNone 都包含在 Rust 的 prelude 模块中(std::prelude::v1),你可以在代码中直接使用 SomeNone 而不需要前缀 Option::。这样做简化了代码的书写,让代码更加清晰和简洁。

但是,虽然你可以直接使用 SomeNone 而不用指定它们属于 Option 类型,这并不意味着它们与 Option 无关。事实上,SomeNone 始终是 Option 类型的一部分,这个关系在逻辑上是不变的。因此,当你使用 SomeNone 时,应当意识到它们是 Option 枚举的成员,这有助于你更好地理解和使用 Rust 的类型系统。

匹配 Option<T>

使用 Option<T>,是为了从 Some 中取出其内部的 T 值以及处理没有值的情况,为了演示这一点,下面一起来编写一个函数,它获取一个 Option<i32>,如果其中含有一个值,将其加一;如果其中没有值,则函数返回 None 值:

rust 复制代码
// 测试代码
#![allow(dead_code)] // 忽略全局dead code,放在模块开头!
#![allow(unused_variables)] // 忽略未使用变量,放在模块开头!

// #[derive(Debug)]

fn plus_one(x: Option<i32>) -> Option<i32> {
    match x {
        None => None,
        Some(i) => Some(i + 1),
    }
}

fn main() {
    let five = Some(5);
    let six = plus_one(five);
    let none = plus_one(None);
}

plus_one 接受一个 Option<i32> 类型的参数,同时返回一个 Option<i32> 类型的值(这种形式的函数在标准库内随处所见),在该函数的内部处理中,如果传入的是一个 None ,则返回一个 None 且不做任何处理;如果传入的是一个 Some(i32),则通过模式绑定,把其中的值绑定到变量 i 上,然后返回 i+1 的值,同时用 Some 进行包裹。

为了进一步说明,假设 plus_one 函数接受的参数值 x 是 Some(5),来看看具体的分支匹配情况:

1、传入参数 Some(5)
rust,ignore 复制代码
None => None,

首先是匹配 None 分支,因为值 Some(5) 并不匹配模式 None,所以继续匹配下一个分支。

rust,ignore 复制代码
Some(i) => Some(i + 1),

Some(5)Some(i) 匹配吗?当然匹配!它们是相同的成员。i 绑定了 Some 中包含的值,因此 i 的值是 5。接着匹配分支的代码被执行,最后将 i 的值加一并返回一个含有值 6 的新 Some

2、传入参数 None

接着考虑下 plus_one 的第二个调用,这次传入的 xNone, 我们进入 match 并与第一个分支相比较。

rust,ignore 复制代码
None => None,

匹配上了!接着程序继续执行该分支后的代码:返回表达式 None 的值,也就是返回一个 None,因为第一个分支就匹配到了,其他的分支将不再比较。

相关推荐
Dovis(誓平步青云)1 分钟前
【数据结构】排序算法(中篇)·处理大数据的精妙
c语言·数据结构·算法·排序算法·学习方法
2401_872945098 分钟前
【补题】Xi‘an Invitational 2023 E. Merge the Rectangles
算法
暮雨哀尘21 分钟前
微信小程序开发:开发实践
开发语言·算法·微信小程序·小程序·notepad++·性能·技术选型
nuo53420231 分钟前
黑马 C++ 学习笔记
c语言·c++·笔记·学习
Touper.36 分钟前
L2-003 月饼
数据结构·算法·排序算法
阿噜噜小栈1 小时前
最新国内可用的Docker镜像加速器地址收集
运维·笔记·docker·容器
叠叠乐6 小时前
rust Send Sync 以及对象安全和对象不安全
开发语言·安全·rust
想跑步的小弱鸡6 小时前
Leetcode hot 100(day 3)
算法·leetcode·职场和发展
niandb7 小时前
The Rust Programming Language 学习 (九)
windows·rust
xyliiiiiL7 小时前
ZGC初步了解
java·jvm·算法