文章目录

    • Rust中的关键字Some、Option
    • 关于枚举
    • Option
    • Some使用举例
  • 参考

Rust中的关键字Some、Option

根据Rust本身的设计哲学, 建议在设计某个变量时, 如果预计该变量某时刻可能会是空值(null/None)的话, 那么尽量用Option/Result来包裹它, 反过来说, 只有你可以肯定该变量不可能为空值时, 才无须这么搞.

rust为了处理情况设置的两个枚举类型,分别是enum Optionenum Result

  • Option的枚举情况有两种,分别是代表有的Some()和代表无的None。 如果是有返回值,则可以通过if let,match,unwrap,?等多种方法对应情况取出Some包裹的值,如果没有则是None。

  • Result的枚举情况也是有两种,表示正确的Ok()和表示错误的Err()。同样也是matchunwrap等等对应方法去提取。分别提取对应情况的内容。

关于枚举

Rust 语言提供了 enum 关键字用于定义枚举。

定义枚举的语法格式如下

enum enum_name {variant1,variant2,variant3
}

Option

严格的来说,只有 Option 和 Result,Some 只是 Option 的一个值包装类型。
Option类型代表了一个可选的值,每个Option要么是一个Some中包含一个值,要么是一个None。Option的定义如下:

pub enum Option<T> {None,Some(T),
}

Option主要有以下一些用法:

  • 初始化值;
  • 作为在整个输入范围内没有定义的函数的返回值;
  • 作为返回值,用None表示出现的简单错误;
  • 作为结构体的可选字段;
  • 作为结构体中可借出或者是可载入的字段;
  • 作为函数的可选参数;
  • 代表空指针;
  • 用作复杂情况的返回值。

我们先来描述一个普通的场景,在很多语言中,获取一个数据可能会返回 null 也可能会没有数据,拿 java 举个例:

User user = model.getUser();if (user == null) {throw new Exception("用户不存在");
}System.out.println("你好:" + user.getName());

我们在拿到一个不确定,可能为空的值时,为了确保不出现 NullPointerException 的问题,需要先判断值是否是 null。

这个看起来没什么问题,不过仔细思考,实际上会有两个问题:

  1. 开发者极容易忘记做 null 的判断,实际开发和测试中也许不容易碰到为 null 的情况,导致线上运行报错。
  2. 即使只是为 null 时简单的抛异常,代码也显的有点啰嗦,这种简单的判断能不能少点代码?

Rust 的 Option 就解决了这个问题。
Option 本质上是一个枚举,有两种分别是SomeNone。Some 代表有值,None 则类似于 null,代表无值。

为什么这么搞呢?
Option和T不是同一个类, 不要小看着一个简单的区别,这意味着Option和T是不能直接进行运算的,即Option和i32是不能直接相加的。实际上,更进一步的,在对Option进行T的运算时,必须先将Option转化成T类型。如此一来就可以帮助我们避免以为值非空而实际为空的情况。

例如:

fn main() {let a: i32 = 1;let b: Option<i32> = Some(5);let c = a + b;println!("{}", c);
}

编译器会报如下错误,我们必须先将b从Option类型转化为i32才能进行i32类型的运算。如下

fn main() {let a: i32 = 1;let b: Option<i32> = Some(5);let c = a + b.unwrap();println!("{}", c);
}

每当我们引入一个可能为空的值时,我们必须先把它放到Option里。当我们使用这个值时,我们必须先处理值为空的情况。也就是说,只要一个值不是Option类型的,我们就可以认定它的值不为空。

Rust在写代码和编译时就发现所有的错误,而不是运行时才发现。理解了这一点,你就能理解 Rust 的各种设定。

Some使用举例

let some_value = Some(10);
match some_value {Some(3) => println!("three"),_ => println! (“other”),
}

但是,当我们只关心等于3时的情况,用match就感觉代码太多了,那么我们就可以使用if let:

if let Some(3) = some_u8_value {println!("three");
} else {println! (“other”);
}

参考

Rust 学习之 Some、Option、Result
参考URL: https://blog.csdn.net/Lee_blog/article/details/120411567

Rust中的关键字Some、Option相关推荐

  1. 理解Rust中的Result/Option/unwrap/?

    我在学习Rust时,注意到有4个概念经常放到一起讨论:Result.Option.unwapr和?操作符.本文记录了我对这4个Rust概念的思考,这个思考过程帮助我理解并学会了如何写出更地道的Rust ...

  2. 17.Rust中函数式语言功能:迭代器与闭包

    Rust 的设计灵感来源于很多现存的语言和技术.其中一个显著的影响就是 函数式编程(functional programming).函数式编程风格通常包含将函数作为参数值或其他函数的返回值.将函数赋值 ...

  3. 关于Oracle数据库19c中的关键字和保留字的说明

    关于Oracle数据库中的关键字和保留字的说明 官方文档节选: ​ You cannot use Oracle SQL reserved words as nonquoted identifiers. ...

  4. Draconian,自由或保姆状态:Java,C#,C,C ++,Go和Rust中的并发意识形态

    为什么我们需要并发 (Why we need Concurrency) Once, there was a good old time when clock speed doubled every 1 ...

  5. rust 案例_Rust特殊枚举Option用法

    在上一节中,我们研究了IpAddr枚举如何使我们使用Rust的类型系统对更多信息进行编码,而不仅仅是将数据编码到程序中.本节探讨的案例研究Option,这是标准库定义的另一个枚举.Option类型在很 ...

  6. linux查找某时间后的关键字,linux - 查找指定时间的文件及文件中的关键字

    Linux查找某个时间内的文件 1.? n天内修改的(-ctime) find . -type f -ctime -1| xargs ls –l 说明: (1) -type f 只搜索文件,不包含文件 ...

  7. rust笔记7 rust中的包管理

    rust相比于C++,一个优势在于有一个现代化的包管理系统,我们不用搞各种命令空间和依赖的问题.这里主要记录了一般文件打包的方式. rust中声明包的关键字是mod,如果是公共的,则需要声明为pub ...

  8. Rust 中的指针:Box、Rc、Cell、RefCell

    Rust 中的指针:Box.Rc.Cell.RefCell 作者:许野平 2022-02-21 Rust 自身具有 &.* 操作符,可以实现变量引用和解引用.为什么又搞出这几个类型的指针呢?原 ...

  9. Rust 中的 mod (模块)

    文章目录 起步 mod 关键字 crate.self.super.use crate self super use 拆分到多文件 感谢 起步 初看<Rust 程序设计语言>第七章的模块管理 ...

最新文章

  1. 使用阿里云服务器安装docker,并用nginx示例
  2. Linux中autoduck批量对接,科学网—用AutoDock进行分子对接教程——半柔性对接 - 杜文义的博文...
  3. Spring MVC X-Frame-Options
  4. 生成jsp验证码的代码详解(servlet版)
  5. Android ContentProvider 使用介绍
  6. 8086微型计算机结构功能,3.2 8086微处理器的功能结构
  7. JavaScript里的父、子节点操作源码解析
  8. Android webm转mp4,android - 如何记录屏幕并输出视频格式为webm并由vp9编码? - 堆栈内存溢出...
  9. Spring的加密工具类---DigestUtils
  10. 扫二维码登录的实现原理
  11. BZOJ1001狼抓兔子(网络流最小割)
  12. 首次揭秘!字节跳动基础架构技术迭代演进之路
  13. 淘宝新开店铺没有营业执照怎么办
  14. android 修改图片定位位置信息,‎App Store 上的“PhotoMapper:照片地理位置修改,GPS EXIF编”...
  15. LayUI分页查询展示数据(SSH框架)
  16. 基本知识 100151
  17. 推荐5款开源报表工具!
  18. mysql repeated read_mysql事务之可重复读(Repeated Read)
  19. 高仿富途牛牛-组件化(二)-磁力吸附
  20. 要来了!国内安卓统一推送标准将于 今年3 月开启测试

热门文章

  1. PS - Photoshop 抠图与剪贴蒙版功能与 Stable Diffusion 重绘
  2. javaSE正文(一)——对象
  3. 数据库和SpringBoot基础01
  4. Xcode Cloud
  5. DPC密度峰值聚类算法原理详解二
  6. 2018几本Python新书推荐!
  7. 英语学习详细笔记(十二)动词
  8. 阿里云性能测试 PTS 上手体验
  9. android service常驻内存的一点思考
  10. NFTScan 与 PANews 联合发布多链 NFT 数据分析报告