Rust语言中Option和Result两种类型的使用

异同之处

不同之处主要在于用途不同
都可以用于Error handle的,都是枚举类型,都可以作为function的返回类型,
二者源码如下

pub enum Option<T> {None,Some(T),
}pub enum Result<T, E> {Ok(T),Err(E),
}

为什么这么设计

有场景才有设计的必要,但是你可能会问,那为什么别的语言就没有这么设计,Rust这么设计的原因与Rust的语言设计理念有关,Rust想要尽力做到安全,尽力把不同的场景分开处理,当你想要在程序里设计一个Error handle流程的时候,使用Result是最好的,当你想要返回一个值但是这个值不一定存在的时候,使用Option是最好的,其实在其他语言中,这些可以直接用一个None或者Null的概念来解决,但是这并不是一个好的设计,Null的存在会将这些东西都混为一谈,在一个Null产生的时候,你无法知道究竟是因为你的算法出了问题导致的,还是因为你的输入不合法导致的,又或者是你调用的某个库内部发生了错误,因为你得到的只有一个Null,一个Null把许多不同的情况耦合到了一起,无论发生了什么你都可以返回一个Null,得到Null的人如何理解Null要看他和你的默契。
当然你可以在你的function内每个有可能产生Null的地方都加一个if,然后返回一个errorcode,或者在function内添加log部件,但是这些都不是标准,跟别人合作的时候,调用其他人库的时候,怎么办?

Null的设计者托尼·霍尔,在后来的演讲中多次提到,Null的设计是一个价值10亿美元的错误

引入Result和Option后,根据不同的场景返回不同的内容,就能确保语言的安全性,一旦你的返回值跟收到这个值的人想法不同,代码就跑不起来,直接编译都过不了,这很符合Rust的设计理念,把bug杀死在编译前。

Rust中并不是没有None,只不过是把None的level降低了很多,从一个垃圾桶,变成了一个固定的概念,None在Rust中只代表无,没有,这一个概念。

各自使用方法

  • 当你实现了一个function,这个function需要返回一个值,这个值可能存在,也可能不存在,比如在一个hashmap中查找一个key,就可以返回function,有,就是Some(value),没有,就是None
  • 当你实现了一个function,这个function可能成功运行,也可能报错,但是你又不想让它直接崩溃,这个时候就用Result。

Option和Result返回值如何使用?
Option和Result都是枚举类型,都可以使用match进行内容提取。Result还可以使用unwrap和except来进行提取,如果结果是Ok则返回数据本身,如果结果是Err则直接崩溃,和panic一个效果,except相较于unwrap的区别是可以自己定义panic崩溃报错内容。

// 使用Option处理可能存在或不存在的值
fn find_element_index(arr: &[i32], target: i32) -> Option<usize> {for (index, &value) in arr.iter().enumerate() {if value == target {return Some(index);}}None
}// 使用Result处理可能的错误情况
fn divide(a: i32, b: i32) -> Result<i32, &'static str> {if b == 0 {Err("Cannot divide by zero")} else {Ok(a / b)}
}fn main() {let numbers = [1, 2, 3, 4, 5];// 使用Optionlet index = find_element_index(&numbers, 3);match index {Some(i) => println!("Element found at index: {}", i),None => println!("Element not found"),}// 使用Resultmatch divide(10, 2) {Ok(result) => println!("Result of division: {}", result),Err(error) => println!("Error: {}", error),}divide(10,2).unwrap();divide(10,2).expect("defined by yourself");
}

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

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

相关文章

ESP8266 控制 LED 亮灭

一、引脚对应 二、按键控制 LED 亮灭 2.1样例1 #include <ESP8266WiFi.h>const int ledPin D2; // LED 连接到 D2 引脚 const int keyPin D4; // 按键连接到 D4 引脚volatile bool flag false; // 记录 LED 状态的标志// 外部中断处理函数 ICACHE_RAM_ATTR void han…

重新温习广软puthon爬虫技术。

下面是我不断试错的一个过程&#xff0c;好多知识点全忘记了&#xff0c;只能不断调实例&#xff0c;不断优化&#xff0c;重构&#xff0c;实现自己的需求。下面是我的运行截图。还是导包的问题。 个人感觉关键的还是这几部&#xff0c;被划了下划线的&#xff0c;存在问题&a…

【智能算法】猎人猎物算法(HPO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2022年&#xff0c;Naruei等人受到自然界动物猎食过程启发&#xff0c;提出了猎人猎物算法&#xff08;Hunter-Prey Optimization&#xff0c; HPO&#xff09;。 2.算法原理 2.1算法思想 HPO模拟…

输出1到10的阶乘--C语言

#include<stdio.h> int fac(int n){if(n<1){return 1;}elsereturn fac(n-1)*n; } int main(){int i, result;for(i1;i<10;i){resultfac(i);printf("%d!%d\n",i,result);}} 输出结果&#xff1a;

Java并发编程基础_Thread类

线程 Thread.class 1. 线程的六种状态 NEW 尚未启动的线程处于此状态。RUNNABLE 在Java虚拟机中执行的线程处于此状态。BLOCKED 被阻塞等待监视器锁定的线程处于此状态。WAITING 正在等待另一个线程执行特定动作的线程处于此状态。TIMED_WAITING 正在等待另一个线程执行动作达到…

C++中浅拷贝和深拷贝对象复制概念

1.浅拷贝&#xff08;Shallow Copy&#xff09;&#xff1a; 浅拷贝是指在对象复制时&#xff0c;只是复制对象的值&#xff0c;而不会复制对象指向的资源。这意味着对象和其副本会指向同一块内存空间&#xff0c;当一个对象改变时&#xff0c;另一个对象也会受到影响。 #inclu…

中国电子学会(CEIT)2021年09月真题C语言软件编程等级考试四级(含详细解析答案)

中国电子学会&#xff08;CEIT&#xff09;考评中心历届真题&#xff08;含解析答案&#xff09; C语言软件编程等级考试四级 2021年09月 编程题四道 总分:100分一、吃奶酪&#xff08;25分&#xff09; Jerry准备偷吃Tom的奶酪。所有的奶酪排成了一条直线&#xff0c;…

回溯算法|216.组合总和III

力扣题目链接 class Solution { private:vector<vector<int>> result; // 存放结果集vector<int> path; // 符合条件的结果// targetSum&#xff1a;目标和&#xff0c;也就是题目中的n。// k&#xff1a;题目中要求k个数的集合。// sum&#xff1a;已经收集…

OpenKylin安装Kafka

一、操作系统 openKylin 1.0.1 X86 二、下载安装包 # 安装依赖jdk sudo apt-get update sudo apt-get install default-jdk # 下载kafka mkdir -p /data/software/kafka wget https://archive.apache.org/dist/kafka/2.4.1/kafka_2.13-2.4.1.tgz三、解压安装 # 解压缩Kafka…

springboot项目学习-瑞吉外卖(4)续

1.任务 菜品的添加功能(涉及到两张表的数据添加) 2.菜品添加 功能页面如上&#xff0c;该页面有两个注意点 菜品分类&#xff1a;点击菜品分类后&#xff0c;会展示当前已有菜品&#xff1a;这个功能的实现要从category表里查询数据&#xff0c;然后再做展示口味做法配置&#…

算法题->移动零的C语言和JAVA的双指针解法

使用C语言和JAVA代码通过双指针进行解题 题目描述:给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 理解题意:不改变数组中非零元素的顺序,并把0元素放在非零元素后面. 链接: https://leetcode.cn/problems/m…

Linux——将云服务器作为跳板机,frp实现内网穿透

文章目录 操作步骤1. 准备工作&#xff1a;2. 配置frp服务器端&#xff1a;3. 配置frp客户端&#xff1a;4. 启动frp客户端&#xff1a;5. 测试连接&#xff1a;6. 安全注意事项&#xff1a; 云服务器性能分析阿里云具体操作步骤1. 购买&#xff1a;2. 登录&#xff1a;3. 首次…

【springboot】闲话 springboot 的几种异步机制 及 长轮询的概念和简单实现

文章目录 引子springboot的几种异步形式开启异步支持和线程池配置&#xff08;重要&#xff09;第一种&#xff1a;Async第二种&#xff1a;Callable<T>第三种&#xff1a;WebAsyncTask<T>第四种&#xff1a;DeferredResult<T> 长轮询的简单实现概念实现服务…

spring boot-引入Redis并封装redistemplate操作工具类

文章目录 一、关于spring-redis二、springboot引入Redis及其使用案例三、封装redistemplate操作工具类 一、关于spring-redis spring-data-redis针对jedis提供了如下功能&#xff1a; 连接池自动管理&#xff0c;提供了一个高度封装的“RedisTemplate”类 针对jedis客户端中大…

设置 Linux 时间同步 同步硬件时钟

设置 Linux 时间同步 同步硬件时钟 配置 NTP 客户端查看当前系统时间使用 ntpdate 命令手动同步时间同步硬件时钟再次检查硬件时钟参考 配置 NTP 客户端 vim /etc/systemd/timesyncd.conf[Time] NTPcn.pool.ntp.org FallbackNTPasia.pool.ntp.org ntp.aliyun.com ntp1.aliyun.…

acwing算法提高之图论--单源最短路的扩展应用

目录 1 介绍2 训练 1 介绍 本专题用来记录使用。。。。 2 训练 题目1&#xff1a;1137选择最佳线路 C代码如下&#xff0c; #include <iostream> #include <cstring> #include <algorithm> #include <queue>using namespace std;const int N 101…

编译amd 的 amdgpu 编译器

1,下载源码 git clone --recursive https://github.com/ROCm/llvm-project.git 2, 配置cmake cmake -G "Unix Makefiles" ../llvm \ -DLLVM_ENABLE_PROJECTS"clang;clang-tools-extra;compiler-rt" \ -DLLVM_BUILD_EXAMPLESON …

springboot企业级抽奖项目业务四 (缓存预热)

缓存预热 为什么要做预热: 当活动真正开始时&#xff0c;需要超高的并发访问活动相关信息 必须把必要的数据提前加载进redis 预热的策略: 在msg中写一个定时任务 每分钟扫描一遍card_game表 把(开始时间 > 当前时间)&& (开始时间 < 当前时间1分钟)的活动及相…

CrossOver软件2024免费 最新版本详细介绍 CrossOver软件好用吗 Mac电脑玩Windows游戏

CrossOver是一款由CodeWeavers公司开发的软件&#xff0c;它可以在Mac和Linux等操作系统上运行Windows软件&#xff0c;而无需在计算机上安装Windows操作系统。这款软件的核心技术是Wine&#xff0c;它是一种在Linux和macOS等操作系统上运行Windows应用程序的开源软件。 Cross…

大语言模型---强化学习

本文章参考&#xff0c;原文链接&#xff1a;https://blog.csdn.net/qq_35812205/article/details/133563158 SFT使用交叉熵损失函数&#xff0c;目标是调整参数使模型输出与标准答案一致&#xff0c;不能从整体把控output质量 RLHF&#xff08;分为奖励模型训练、近端策略优化…