当前位置: 首页 > news >正文

Rust语言之Option枚举类型

概述

Option是Rust语言设计中最重要的枚举类型之一,它编码了其它语言中空值与非空值的概念,差异在于,Rust不会允许你像其它语言一样以非空值的方式来使用一个空值,这避免了很多错误。Option在标准库中的定义如下:

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

Option枚举使用了泛型类型参数,这表示Option的Some成员可以包含任意类型的数据,同时如果类型参数T实现了Copy trait,那么Option也就实现了Copy trait。

修改Option内部存储的值

由于Option类型将真正的数据存储到了内部,因此需要通过模式进行内部存储数据的修改,下面示例展示了常用的基于模式的修改方式,另外通过Option类型提供的一些方法也可以达到修改的目的,例如take/replace,我们会在后面提及。

let mut x = Some(34);// 方式一
match &mut x {Some(v) => *v = 42,     // 等价于&mut Some(ref mut v)None => {},
}
assert_eq!(x, Some(42));// 方式二
match x {Some(ref mut v) => *v = 47,None => {},
}
assert_eq!(x, Some(47));

Option的常用方法

is_none方法

is_none方法检查option的值是否是None,原型定义如下:

pub const fn is_none(&self) -> bool

使用示例:

let x: Option<u32> = Some(2);
assert_eq!(x.is_none(), false);let x: Option<u32> = None;
assert_eq!(x.is_none(), true);

as_ref方法

as_ref方法将&Option转换成Option<&T>,原型定义如下:

pub const fn as_ref(&self) -> Option<&T>

as_mut方法

as_mut方法将&mut Option转换成Option<&mut T>,原型定义如下:

pub fn as_mut(&mut self) -> Option<&mut T>

使用示例:

let mut x = Some(2);
match x.as_mut() {Some(v) => *v = 42,None => {},
}
assert_eq!(x, Some(42));

take方法

take方法从option取出值,原option值修改成为None,原型定义如下:

pub fn take(&mut self) -> Option<T>

使用示例:

let mut x = Some(2);
let y = x.take();
assert_eq!(x, None);
assert_eq!(y, Some(2));let mut x: Option<u32> = None;
let y = x.take();
assert_eq!(x, None);
assert_eq!(y, None);

replace方法

replace方法从option取出值,同时使用指定值修改原option值,原型定义如下:

pub fn replace(&mut self, value: T) -> Option<T>

使用示例:

let mut x = Some(2);
let old = x.replace(5);
assert_eq!(x, Some(5));
assert_eq!(old, Some(2));let mut x = None;
let old = x.replace(3);
assert_eq!(x, Some(3));
assert_eq!(old, None);

unwrap方法

unwrap方法消费option值,返回Some内的数据,原型定义如下:

pub fn unwrap(self) -> T

使用示例:

let x = Some("air");
assert_eq!(x.unwrap(), "air");

关于Option的更多操作方法,可以参考Rust标准库:https://doc.rust-lang.org/std/option/enum.Option.html。

相关参考

  • 《Rust程序设计》
  • 《Rust程序设计语言》

相关文章:

Rust语言之Option枚举类型

概述 Option是Rust语言设计中最重要的枚举类型之一&#xff0c;它编码了其它语言中空值与非空值的概念&#xff0c;差异在于&#xff0c;Rust不会允许你像其它语言一样以非空值的方式来使用一个空值&#xff0c;这避免了很多错误。Option在标准库中的定义如下&#xff1a; pu…...

基于TimeQuest时序优化原理和方法

&#x1f4a1; 回顾基于RTL逻辑时序优化的基本思路&#xff0c;在关键路径中插入寄存器来优化时序 分析最坏路径 通过前面对TimeQuest软件的理解&#xff0c;基本上可以找到关键路径&#xff0c;此文章主要对关键路径时序进行优化&#xff0c;使设计达到时序要求&#xff0c;以…...

LeetCode第332场周赛

2023.2.12LeetCode第332场周赛 6354. 找出数组的串联值 思路 双指针模拟&#xff0c;两个指针相遇的时候要特判 算法 class Solution { public:long long findTheArrayConcVal(vector<int>& nums) {long long ans 0;int i 0, j nums.size() - 1;while (i <…...

2023-2-12刷题情况

字母板上的路径 题目描述 我们从一块字母板上的位置 (0, 0) 出发&#xff0c;该坐标对应的字符为 board[0][0]。 在本题里&#xff0c;字母板为board [“abcde”, “fghij”, “klmno”, “pqrst”, “uvwxy”, “z”]&#xff0c;如下所示。 我们可以按下面的指令规则行动…...

拉普拉斯矩阵

拉普拉斯算子 Δff(xi1,yj)f(xi−1,yj)f(xi,yj1)f(xi,yj−1)−4f(xi,yj)∑(k,l)∈N(i,j)(f(xk,yl)−f(xi,yj))\begin{aligned} \Delta f & f\left(x_{i1}, y_j\right) f\left(x_{i-1},y_j\right) f\left(x_i,y_{j1}\right)f\left(x_i,y_{j-1}\right) - 4f\left(x_i,y_j\r…...

Top-1错误率、Top-5错误率等常见的模型算法评估指标解析

Top-1 错误率&#xff1a;指预测输出的概率最高的类别与人工标注的类别相符的准确率&#xff0c;就是你预测的label取最后概率向量里面最大的那一个作为预测结果&#xff0c;如过你的预测结果中概率最大的那个分类正确&#xff0c;则预测正确&#xff0c;否则预测错误。比如预测…...

Urho3D 容器类型

Urho3D实现了自己的字符串类型和模板容器&#xff0c;而不是使用STL。其基本原理如下&#xff1a; 在某些情况下提高了性能&#xff0c;例如使用PODVector类时。保证字符串和容器的二进制大小&#xff0c;以允许例如嵌入Variant对象内。减少了编译时间。直接命名和实现&#x…...

C语言学习笔记(四): 循环结构程序设计

while语句 定义 While语句是C语言中的循环语句&#xff0c;它按条件循环执行语句&#xff0c;直到条件不满足为止 语法格式如下: while(condition) {//循环体内容; }使用实例 求123…100 include <stdio.h> int main(){int i 1, sum 0;while (i<100){sum i …...

02 OpenCV图像通道处理

1 通道提取与合并 在数字图像处理中&#xff0c;图像通道是指一个图像中的颜色信息被分离为不同的颜色分量。常见的图像通道包括RGB通道、灰度通道、HSV通道等。 RGB通道是指将图像分离为红色、绿色和蓝色三个颜色通道&#xff0c;每个通道表示相应颜色的亮度。这种方式是最常…...

微信小程序图书馆座位预约管理系统

开发工具&#xff1a;IDEA、微信小程序服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8项目构建&#xff1a;maven数据库&#xff1a;mysql5.7前端技术&#xff1a;vue、uniapp服务端技术&#xff1a;springbootmybatis本系统分微信小程序和管理后台两部分&#xff0c;项目采用…...

有限元分析学习一

系列文章目录 有限元分析学习一 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录系列文章目录前言一、有限元方法的简单介绍1.1 有限元的基础概念1.2 有限元软件发展历史1.3 有限元软件二、弹性力学的简单介绍2.1.…...

android avb2.0 总结

1、android vbmeta结构深入解析 2、android libavb深入解读 看完结构与代码,进一步了解了avb 比如vbmeta的结构、5种描述符、hash公钥签名存储位置 多层vbmeta结构、无vbmeta分区的验证逻辑、hash计算对比、公钥验证、签名验签、5种描述符体的处理 但是还有一些问题没有解决 如…...

聊天机器人-意图识别类,开源库推荐

随着人工智能和自然语言处理技术的不断发展&#xff0c;聊天机器人在商业、教育、医疗等领域的应用越来越广泛。因此&#xff0c;开源聊天机器人代码库也逐渐成为了热门话题。 开源聊天机器人代码库可以帮助开发者快速构建功能强大的聊天机器人&#xff0c;而不必从头开始编写…...

Java 标识符以及修饰符

Java 标识符Java 所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。关于 Java 标识符&#xff0c;有以下几点需要注意&#xff1a;所有的标识符都应该以字母&#xff08;A-Z 或者 a-z&#xff09;,美元符&#xff08;$&#xff09;、或者下划线&#xff08;_&…...

封装、继承、Super、重写、多态instanceof类型转换的使用以及个人见解

这里写目录标题封装继承supersuper和this的区别重写多态instanceof类型转换封装 之前我们调用共有的属性&#xff0c;是直接可以调用的 但是属性私有后&#xff0c;无法在直接.调用 只能通过getset调用 继承 super 可以直接调用父类中属性和方法&#xff0c;私有的无法做 其…...

day13_面向对象的三大特征之一(封装)

封装概述 为什么需要封装&#xff1f; 现实生活中&#xff0c;每一个个体与个体之间是有边界的&#xff0c;每一个团体与团体之间是有边界的&#xff0c;而同一个个体、团体内部的信息是互通的&#xff0c;只是对外有所隐瞒。例如&#xff1a;我们使用的电脑&#xff0c;内部…...

越界访问数组

越界访问是指访问&#xff08;操作修改&#xff09;了不属于自己的空间 我们以如下代码为例&#xff1a;此代码在vs中进行 #include <stdio.h> int main() {int i 0;int arr[] {1,2,3,4,5,6,7,8,9,10};for(i0; i<12; i){arr[i] 0;printf("hello\n");}r…...

软件设计(十)--计算机系统知识

软件设计&#xff08;九&#xff09;https://blog.csdn.net/ke1ying/article/details/128990035 一、效验码 奇偶效验&#xff1a;是一种最简单的效验方法。基本思想是&#xff1a;通过在编码中增加一个效验位来使编码中1的个数为奇数&#xff08;奇效验&#xff09;或者为偶…...

【不知道是啥】浅保存哈

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…...

2021 WAIC 世界人工智能大会参会总结

前言 2021 年世界人工智能大会&#xff08;WAIC&#xff09;于2021年7月7日至10日在上海世博展览馆举办&#xff0c;本届大会继续秉持「智联世界」的理念&#xff0c;以「众智成城」为主题&#xff0c;促进全球人工智能创新思想、技术、应用、人才和资本的集聚和交流&#xff…...

.NET eShop 开源项目教程

.NET eShop 开源项目教程 【免费下载链接】eShop A reference .NET application implementing an eCommerce site 项目地址: https://gitcode.com/GitHub_Trending/es/eShop 1. 项目介绍 .NET eShop 是一个基于 Microsoft 的 .NET 技术栈开发的开源电子商务平台。该项目…...

Kook Zimage真实幻想Turbo部署案例:Jetson AGX Orin边缘设备轻量化幻想图推理尝试

Kook Zimage真实幻想Turbo部署案例&#xff1a;Jetson AGX Orin边缘设备轻量化幻想图推理尝试 1. 为什么在Jetson上跑幻想图&#xff1f;——不是“能不能”&#xff0c;而是“值不值” 很多人看到“幻想风格文生图”第一反应是&#xff1a;这得A100起步吧&#xff1f;显存不…...

Meixiong Niannian画图引擎CFG引导实验:从3.0到12.0的画质变化图谱

Meixiong Niannian画图引擎CFG引导实验&#xff1a;从3.0到12.0的画质变化图谱 1. 引言&#xff1a;为什么CFG系数如此重要&#xff1f; 如果你用过AI画图工具&#xff0c;一定遇到过这样的困惑&#xff1a;明明描述词写得很好&#xff0c;为什么生成的图片要么太“放飞自我”…...

计算机毕设 java 基于 Android 的 “课堂管理助手” 移动应用开发 SpringBoot 安卓智能课堂管理移动应用 JavaAndroid 师生互动与教学管理平台

计算机毕设 java 基于 Android 的 “课堂管理助手” 移动应用开发 07s039&#xff0c;末尾的数字和英文也要加上 &#xff08;配套有源码 程序 mysql 数据库 论文&#xff09;本套源码可以先看具体功能演示视频领取&#xff0c;文末有联 xi 可分享在教育信息化快速发展的背景下…...

Yuzu模拟器终极指南:7天学会如何选择最佳版本和优化性能 [特殊字符]

Yuzu模拟器终极指南&#xff1a;7天学会如何选择最佳版本和优化性能 &#x1f3ae; 【免费下载链接】yuzu-downloads 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu-downloads 还在为选择哪个Yuzu模拟器版本而头疼吗&#xff1f;&#x1f62b; 别担心&#x…...

通信网络升级与算力基建驱动,稳增前行:全球光纤光缆油膏2026-2032年CAGR4.2%,2032年锚定3.15亿美元

QYResearch调研显示&#xff0c;2025年全球光纤光缆油膏市场规模大约为2.37亿美元&#xff0c;预计2032年将达到3.15亿美元&#xff0c;2026-2032期间年复合增长率&#xff08;CAGR&#xff09;为4.2%。产品定义&#xff1a;精细配方&#xff0c;保障性能光纤油膏&#xff0c;简…...

模型轻量化前沿:OpenClaw集成百川2-13B-4bits量化版的技术解析

模型轻量化前沿&#xff1a;OpenClaw集成百川2-13B-4bits量化版的技术解析 1. 为什么我们需要量化模型&#xff1f; 当我第一次尝试在本地部署百川2-13B模型时&#xff0c;16GB显存的显卡直接被"撑爆"。这让我意识到&#xff0c;想要在消费级硬件上运行大模型&…...

基于springboot岳麓山景区预约系统设计与开发(源码+精品论文+答辩PPT等资料)

博主介绍&#xff1a;CSDN毕设辅导第一人、靠谱第一人、全网粉丝50W,csdn特邀作者、博客专家、腾讯云社区合作讲师、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交…...

1746-NR4电阻模拟输入

1746-NR4 模拟输入模块&#xff08;电阻输入&#xff09;特点由 Allen-Bradley 生产&#xff0c;属于 SLC 500 系列类型为 模拟输入模块&#xff0c;专门用于电阻信号采集提供 4 路独立输入通道支持热电偶、RTD&#xff08;热电阻&#xff09;及其他电阻传感器输入精度高&#…...

Day06 面向对象基础结束→高级开始

面向对象基础this关键字概念&#xff1a;this 代表当前类对象的引用&#xff08;地址&#xff09; 使用 this 区分重名问题&#xff1a;当局部变量和成员变量出现了重名的情况&#xf…...