Rust语言入门教程(十三) - 重要的枚举类型Option与Result

news2024/11/24 4:24:50

Option

首先,还是再列出Option的定义, 它用于任何可能为空的变量。

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

下面的代码展示了如何创建一个空类型:

let mut x: Option<i32> = None;

注意在<>中我们指定了x如果不为空时的关联数据变量类型,且使用None时, 也没有使用use Option::*或者Option::None, 这是因为Option类型实在是太常用了,所以Rust默认已经把他们都引入了,不需要再手动导入。

显式的声明变量为Option枚举类在很多时候也不是必须的, 编译器可以自动根据代码推断,与变量的声明和初始化类似:

let mut x = None; // 可以推断出x是一个Option类型
x = Some(5); // 可以推断出其中Some变体的关联数据类型为i32

判断一个Option类的变量是Some还是None还有一个方便的方法:

let mut x = None;
x = Some(5);
x.is_some() // 判断是否为Some变体类型
x.is_none() // 判断是否为None

此外, Option还实现了IntoIteratorTrait, 这使得它可以被视为一个长度为0或1的向量,从而可以用for循环进行迭代操作:

let mut x = None;
x = Some(5);
x.is_some() // 判断是否为Some变体类型
x.is_none() // 判断是否为None
for i in x {
	println!("{}", i); // 输出 5
}

Result

另一个非常重要且常用的枚举类型是Result, 通常用于返回值类型,只要返回的结果可能是一个正常的值,或者有可能是一个错误,就应该使用Result, 这对我们进行异常或错误处理非常有用。Result类型在Rust的内置模块io中特别常见。

Result的定义如下:

#[must_use]
enum Result<T, E> {
	Ok(T),
	Err(E),
}

从上面的代码中我们可以看出:

  • Ok和Err两个变体分别关联两种数据类型,都是泛型;
  • Ok(T) 表示操作成功并关联成功值,而 Err(E) 表示操作失败并关联错误信息。
  • #[must_use] 属性是一个编译器指令,它用于指定某个值、类型或函数的返回值是“必须使用”的。这意味着如果返回的值没有被使用,编译器将发出警告。这个属性的目的是提醒程序员注意对特定值或函数返回结果的处理,以防止忽视可能重要的结果。

正如上文所说,Resultio库中非常常见,因为当我们在处理io操作时, 发生错误的几率是很大的, 让我们来看一个例子:

use std::fs::File;

fn main() {
	File::open("foo");
}

在上面的代码中,我们将File这个包引入作用域,用其中的open函数尝试打开一个名为foo的文件,open函数将返回一个Result, 猜猜上面的代码能顺利通过编译吗?请添加图片描述
如图所示,我们得到了一个编译器警告,这只是一个警告,并不会阻止我们通过编译,但是正如上文所说, 我们上面的代码中得到了一个Result, 但没有对它做任何操作就丢弃了它,因此会得到这个告警,编译器强烈建议我们要对其进行处理,因为Result的结果很可能是一个错误。

Result结果处理

unwrap()

那我们应该怎样对Result进行处理呢,最简单的一个方法是使用unwrap():

use std::fs::File;

fn main() {
	let res = File::open("foo");
	let f = res.unwrap();
}

上面的代码中,在res是一个Ok变体类型时,f将被赋值为Ok的关联数据, 本例中,应当为foo的文件句柄。如果文件无法打开,那res将是一个Err类型的变体,此时unwrap()会造成panic导致程序崩溃退出(崩溃退出也许也是我们某些情况下期望的结果)。

expect()

另一个方法是expect()。 它的行为与unwrap()基本相同,不同的是, expect()接受一个字符串参数,在程序崩溃时,会把字符串打印在崩溃输出中,作为失败的提示。

use std::fs::File;

fn main() {
	let res = File::open("foo");
	let f = res.expect("error message");

is_ok()

与Option一样,Result也提供了一些便捷的方法来判断变体类型, is_ok返回一个布尔值,来判断是否是Ok类型的变体:

use std::fs::File;

fn main() {
	let res = File::open("foo");
	if res.is_ok() {
		res.unwrap();
	}
}

上面的代码就保证了只有在操作成功时才对res进行展开,避免程序崩溃。

模式匹配处理Result

最好的方法还是使用match模式匹配来处理Result, 确保成功和失败的操作都可以被正确处理。

use std::fs::File;

fn main() {
	let res = File::open("foo");
	match res {
		Ok(f) => { do_stuff(f); }
		Err(e) => { handle_err(e); }
	}
}

小结

本章重点介绍了Rust中两种最常见且最有用的枚举类型, 并介绍了对他们进行处理的常见方法。下一章将介绍Rust中另一个重要的设计: 闭包(Closure)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1265742.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用Spring Boot构建restful web service的详细流程

本文档构建一个简单的restful webservice&#xff0c; 在官网原文Getting Started | Building a RESTful Web Service (spring.io)的基础上进行操作 文章目录 一、项目创建流程1.1 创建项目1.2 创建资源表示类1.3 创建资源控制类 二、项目运行参考资料 一、项目创建流程 本文的…

手写promise A+、catch、finally、all、allsettled、any、race

目录 手写promise 同步版 1.Promise的构造方法接收一个executor()&#xff0c;在new Promise()时就立刻执行executor回调 2.executor()内部的异步任务被放入宏/微任务队列&#xff0c;等待执行 3.状态与结果的管理 状态只能变更一次 4.then()调用成功/失败回调 catch是…

简单测试大语言模型 Yi-34B 的中日英能力

简单测试大语言模型 Yi-34B 的中日英能力 0. 背景1. 中文测试2. 日文测试3. 英文测试 0. 背景 简单测试一下C-Eval 排行榜第一&#xff08;20231129时点&#xff09;的 Yi-34B 的中日英能力&#xff0c; 1. 中文测试 问题1&#xff0c;回答正确。 问题2&#xff0c;回答正确。…

monorepo多项目管理主流实现方式:1.learn + yarn/npm workspace 2.pnpm

npm域级包 随着npm包越来越多&#xff0c;而且包名也只能是唯一的&#xff0c;如果一个名字被别人占了&#xff0c;那你就不能再使用这个名字&#xff1b;假设我想要开发一个utils包&#xff0c;但是张三已经发布了一个utils包&#xff0c;那我的包名就不能叫utils了&#xff…

仿美团外卖源码/在线外卖平台源码PHP/支持多商户+多样化配送费+本土外卖+支持第三方配送

源码简介&#xff1a; 进云仿美团外卖源码&#xff0c;作为外卖平台源码&#xff0c;它不仅支持多商户、多样化配送费、本土外卖&#xff0c;还支持第三方配送。 进云仿美团外卖源码是一个进云源生插件&#xff0c;支持多商户多样化配送费模式本土外卖平台支持第三方配送&…

浅谈安科瑞网络电力仪表在斯里兰卡某项目的应用

摘要&#xff1a;安科瑞APM系列网络仪表适用于高低压柜&#xff0c;进线以及出线处的全电量测量及监测。 Absrtact: APM series of network power meter are suitable for full power measurement and monitoring of high and low voltage cabinets, incoming and outgoing li…

简洁、高效、灵活:探索 Spring 同级别的编程框架

文章目录 GrailsMicronautVert.xQuarkusPlay FrameworkDropwizard 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 作为一个Java开发者&#xff0c;Spring框架应该基本上都用过的&#x…

Docker容器网络模式

1.none网络 1&#xff09;使用默认网络模式创建一个BusyBox容器&#xff0c;用于对比none网络模式&#xff1b; 测试网络&#xff0c;可以正常连接外网。 2&#xff09;再创建一个none网络模式的BusyBox容器&#xff1b; 测试网络连接&#xff0c;无法连接外网。 总结&#x…

C++:C++11新特性---右值引用

文章目录 初始化方式显示查看类型initializer_listdecltype左值引用和右值引用move左右值引用的场景 万能引用和完美转发 本篇总结C11新特性 初始化方式 C11对参数列表的初始化有了更明确的定义&#xff0c;可以这样进行定义 // 列表初始化 void test1() {// 旧版本int x 0…

前端大屏适配几种方案

记录一下前端大屏的几种适配方案。 我们是1920*1080的设计稿。 目录 目录 一、方案一&#xff1a;remfont-size 二、方案二&#xff1a;vw&#xff08;单位&#xff09; 三、方案三&#xff1a;scale&#xff08;缩放&#xff09;强烈推荐 1、根据宽度比率进行缩放 2、动…

点云凹凸缺陷检测 最高层点云 点云聚类

文章目录 0. 数据说明1. 凹凸缺陷基本内容2. 详细检测思路 结果&#xff1a; 0. 数据说明 如上图所示&#xff0c;需要检测的内容为红色框内标出的缺陷部分。简单示例如下红色线条。 但是&#xff0c;由于噪声的影响&#xff0c;点云的平面度并不好&#xff0c;且横梁边缘处存…

4/150:寻找两个正序数组的中位数⭐

题目&#xff1a;寻找两个正序数组的中位数 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 题解1&#xff1a;暴力 暴力思路简介&#xff0c;…

在数据库中进行表内容的修改(MYSQL)

根据表中内容&#xff0c;用命令语句创建数据库&#xff0c;表格&#xff0c;以及插入&#xff0c;修改&#xff0c;删除表格中的内容。 创建数据库&#xff1a;zrzy mysql> create database zrzy; 引用zrzy数据库&#xff1a; mysql> use zrzy; 创建student_info表&…

蓝桥杯day02——移动机器人

1.题目 有一些机器人分布在一条无限长的数轴上&#xff0c;他们初始坐标用一个下标从 0 开始的整数数组 nums 表示。当你给机器人下达命令时&#xff0c;它们以每秒钟一单位的速度开始移动。 给你一个字符串 s &#xff0c;每个字符按顺序分别表示每个机器人移动的方向。L 表…

随时随地,打开浏览器即可体验的在线PS编辑器

即时设计 即时设计是国产的专业级 UI 设计工具&#xff0c;不限平台不限系统&#xff0c;在浏览器打开即用&#xff0c;能够具备 Photoshop 的设计功能&#xff0c;钢笔、矢量编辑、矩形工具、布尔运算等设计工具一应俱全&#xff0c;是能够在线使用的 Photoshop 免费永久工具…

Redis实战命令

实战命令 单值缓存 set key value get key 对象缓存 &#xff08;1&#xff09;set user:1 value(json格式) &#xff08;2&#xff09;mset user:1:name junfeng user:1:age 18 mget user:1:name user:1:age 分布式锁 分布式锁解决了什么问题&#xff1f; 分布式锁解…

63 权限提升-Linux脏牛内核漏洞SUID信息收集

目录 演示案例:Linux提权自动化脚本利用-4个脚本Linux提权SUID配合脚本演示-AliyunLinux提权本地配合内核漏洞演示-MozheLinux提权脏牛内核漏洞演示-Aliyun&#xff0c;Vulnhub涉及资源: linux提权相对windows提权方法相对少一些&#xff0c;linux提权方法相对来讲有七八种方式…

WIFI HaLow技术引领智能互联,打破通信限制

在过去十年里&#xff0c;WIFI技术已在家庭和企业中建立起了庞大的网络&#xff0c;连接了数十亿智能互联设备&#xff0c;促进了信息的迅速传递。然而&#xff0c;当前的WIFI标准存在一些挑战&#xff0c;包括协议范围的限制和整体功能的受限&#xff0c;导致在较远距离进行通…

Python开发——工具篇 Pycharm的相关配置,Python相关操作 持续更新

前言 本篇博客是python开发的工具篇相关&#xff0c;介绍pycharm的使用和相关配置&#xff0c;收录python的相关操作&#xff0c;比如如何启动jupyter。 目录 前言引出Pycharmpycharm如何不同等级日志显示不同颜色设置不同pycharm的python环境 Python操作如何启动Jupyter 总结…

SpringBoot : ch11 整合RabbitMQ

前言 在当今的互联网时代&#xff0c;消息队列成为了构建高可靠、高性能系统的重要组件之一。RabbitMQ作为一个可靠、灵活的消息中间件&#xff0c;被广泛应用于各种分布式系统中。 本篇博客将介绍如何使用Spring Boot整合RabbitMQ&#xff0c;实现消息的发送和接收。通过这种…