《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,因为第一个分支就匹配到了,其他的分支将不再比较。

相关推荐
智驱力人工智能3 小时前
工厂智慧设备检测:多模态算法提升工业安全阈值
人工智能·算法·安全·边缘计算·智慧工厂·智能巡航·工厂设备检测
茴香豆的茴14 小时前
转码刷 LeetCode 笔记[2]:203. 移除链表元素(python)
笔记·leetcode·链表
wdfk_prog4 小时前
[Linux]学习笔记系列 -- [arm][lds]
linux·运维·arm开发·笔记·学习
无名咸鱼5 小时前
CICD部署流程详解文档笔记
笔记·ci/cd
2501_924731476 小时前
城市路口识别准确率↑31%!陌讯时空建模算法在交通拥堵识别中的突破
人工智能·算法·目标检测·计算机视觉·目标跟踪
秋风战士6 小时前
通信算法之306:精通FPGA-笔记核心
笔记·fpga开发
熬了夜的程序员6 小时前
【华为机试】208. 实现 Trie (前缀树)
数据结构·算法·华为od·华为
一颗正在价投韭菜6 小时前
《范仲淹传》读书笔记与摘要
笔记·学习·范仲淹
teeeeeeemo8 小时前
js 实现 ajax 并发请求
开发语言·前端·javascript·笔记·ajax
小O的算法实验室8 小时前
2024年ESWA SCI1区TOP,自适应种群分配和变异选择差分进化算法iDE-APAMS,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进