Rust 中的 Option、Result 和 ? 运算符

这篇具有很好参考价值的文章主要介绍了Rust 中的 Option、Result 和 ? 运算符。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Option类型

在编程中,我们经常会遇到某个值或者某个数据域可能存在,可能不存在;如果存在,它才会包含某个值。在C/C++ 中,一般会使用 NULL 表示不存在这种情况,而 NULL 是很多异常和安全的祸根。Rust 从语言层面就删除了对 NULL 的支持,并在标准库中引入 Option 类型,用于表示上述那种可能存在可能不存在的情况。

Option 类型定义如下,它包含在 prelude 中,可以直接引用。

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

Result 类型

一个功能、服务的执行结果分为2类:(1)执行成功,返回执行结果;(2)执行失败,返回失败原因。在传统编程语言中,一般使用同一类型的返回值表示这两类结果,这会容易出现混淆。Rust 标准库引入 Result 类型,它是一个 enum 类型,用不同的枚举值类型表示两类结果。同时,基于Rust enum 类型的优点,将执行结果和失败原因包含在其中。借助特定声明式标记#[must_use] ,在代码没有处理这个结果时,给出编译警告,提供程序员优化代码。

Result 类型定义如下,它包含在 prelude 中,可以直接应用。

enum Result<T, E> {
   Ok(T),
   Err(E),
}

? 运算符

良好的 Rust 代码,很多时候,函数返回的是 Result 类型,如果每个调用都要处理一次返回值,代码就比较繁琐,很多时候,当调用的子函数返回的是 Err 时,我们只是想把这个 Err 传导到调用者函数,借助 ? 运算符,我们就可以实现这样功能。如果子函数返回的是 Ok 时,函数继续往下走;如果返回的是 Err,函数返回并返回这个 Err,由更上层的调用者负责具体处理 Result。

fn fun1() -> Result<int32, String> {

}

fn fun2() -> Result<int32, String> {

}

fn fun1() -> Result<int32, String> {

}


/// 传统处理方式
fn fun() -> Result<int32, String> {
	if let Err(e) = fun1() {
    return Err(e);
  }

	if let Err(e) = fun2() {
    return Err(e);
  }

	if let Err(e) = fun3() {
    return Err(e);
  }

	Ok(i)
}

/// 借助 ? 运算符
fn fun() -> Result<int32, String> {
	fun1()?;
  fun2()?;
  fun3()?;

	Ok(i)
}

/// 当然,在更上层的调用函数中,还是需要程序员处理这个Result的。比如
fn main() {

  // fun() 的调用者 main() 返回值不是 Result,就无法再向上传导了。
  // 或者fun() 的调用者需要主动对 Err 做处理时,就不要再直接向上传导。
	let ret = fun();

  match ret {
    Ok(i) => {
      println!("success, ret is {i}");
    }
    Err(e) => {
      println!("Fail, error reason is {e:}");
    }
  }
}

? 运算符同样适用于 Option,当遇到 None 时,直接返回并向上传导。文章来源地址https://www.toymoban.com/news/detail-818929.html

到了这里,关于Rust 中的 Option、Result 和 ? 运算符的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ChatGPT辅助学Rust | 基础系列 | 基础语法】变量,数据类型,运算符,控制流

    本章节将详细介绍Rust的基础语法,包括变量,数据类型,运算符,以及控制流。每个部分都将提供详细的解释和代码示例,以便于理解和学习。 在编程语言中,变量是一种基本的概念,它们是用来存储数据的。在Rust中,变量的特性和其他语言有所不同。 在Rust中,变量的定

    2024年02月14日
    浏览(88)
  • C语言中的运算符及算术运算符详解

    在C语言中,运算符是一种特殊的符号,用于表示数据的运算、赋值和比较等。本文将介绍C语言中的运算符,特别关注算术运算符,并提供一些示例来说明它们的用法。 C语言中的运算符可以按照其功能和操作数个数进行分类。以下是一些主要的运算符分类: 1. 按照功能分类

    2024年01月22日
    浏览(69)
  • 【JAVA】你可知JAVA中的运算符|重温运算符

    作者主页:paper jie的博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVASE语法系列》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将javaSE基础知识一网打尽,希望可以帮到读者们哦。 其他专栏

    2024年02月15日
    浏览(44)
  • C++ 中的运算符,包括三目运算符,关系和逻辑运算符,地址运算符等等(C++复习向p8)

    加减乘除 ±*/:略 取模运算符 %: 比如 10 % 4=2 自增运算符 ++:给自己加1 自减运算符 —:给自己减1 “==” 是否相等 “!=” 是否不等 “” 是否大于 “” 是否小于 逻辑与,如果2个都是true,条件才true || 逻辑或,两个有一个是true,就是true ! 逻辑非,true变成false,false变成t

    2024年02月07日
    浏览(49)
  • Java中的运算符--短路运算

    JAVA中有两个短路运算,一个是短路与,一个是短路或。 所谓短路,就是当一个参与运算的操作数足以推断该表达式的值时,另一个操作数(可能是表达式)就不会执行。 短路与: 短路或: || 应用: 逻辑与、逻辑或都是自作向右计算。 两边同时为true,则为true。 有一方为fal

    2024年02月16日
    浏览(44)
  • python中@运算符和*运算符在矩阵乘法中的区别与作用

      我们在看python程序时,经常可以看到@运算符和*运算符,其中@运算符在传统python中通常是作为装饰器使用的。但是在Python 3.5之后,它又具备了矩阵乘法运算的功能。下面使用示例来对比这两个运算符对矩阵运算的影响:   导入用到numpy包:   创建一个维度为2×3×3的

    2024年02月12日
    浏览(47)
  • Verilog中的^~、~^、~&、~|运算符

    今天看书上的Verilog代码中,出现了运算符 ~^ ,从来没见过,搜了一些资料,记录一下。 ~^ 、 ^~ 作为二元运算符时,是同或; ~^ 、 ^~ 作为一元运算符时,是 缩减异或的取反 (感谢@smile、陌离老哥在评论区指正); ~ 只能作为一元运算符,是对缩减 结果的取反; ~| 只能作为

    2024年02月02日
    浏览(57)
  • C语言中的除法运算符“/”与取模运算符“%”:深入解析与示例

    🔥温馨提示🔥:使用电脑端阅读,获取更好体验🚀 在C语言中, / 和 % 运算符是与除法相关的两个运算符,它们有以下特点: / (除法运算符): 用途:计算两个数之间的除法。 结果类型:如果两个操作数都是整型,结果也将是整型,且向下取整(即忽略小数部分,也称

    2024年03月15日
    浏览(88)
  • Java中的运算符

      Java是一种强大的编程语言,其中运算符是编写代码时不可避免的一部分。运算符允许程序进行各种算术、逻辑和比较操作,以及数学函数。 算术运算符用于执行基本的算术运算,如加减乘除。下表列出了常见的算术运算符: 运算符 描述 + 加法 - 减法 * 乘法 / 除法 % 取模(

    2024年02月14日
    浏览(42)
  • Golang中的运算符

      目录 运算符 算术运算符 代码案例: 关系运算符 代码案例: 逻辑运算符 代码案例: 位运算符 代码案例: 赋值运算符 代码案例: 其他运算符 Go语言中的算术运算符包括加、减、乘、除和取模等。需要注意的是,除法运算符/和取模运算符%只能用于整数类型,而不能用于

    2024年02月04日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包