Unwrap 及其在 Rust 中的使用

本文将介绍 unwrap 及其在 Rust 中的使用。

Rust 中的 unwrap

在 Rust 中,unwrap 意味着发出以下命令:给我计算结果,如果有错误,恐慌并停止程序。因为解包是一个非常简单的过程,所以演示它的代码对我们是有益的。

但是,我们需要先调查 OptionResult 类型,然后才能执行此操作。

Option 类型

Option 类型是一种使用 Rust 类型系统表达缺席可能性的方法。将缺席的可能性编码到类型系统中是至关重要的,因为它迫使编译器强制程序员处理缺席。

如果可能不存在,则使用 std 库中名为 Option<T>enum。它采用两个选项之一的形式。

  1. Some(T) – 已识别类型 T 的元素。
  2. None – 未检测到任何元素。

这些情况可以使用 match 显式或隐含 unwrap 处理。隐式处理返回内部元素或 panics

语法:

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

查找文件扩展名的示例:

fn find(haystack: &str,words: char)-> Option<usize>{haystack.find(words)}fn main(){letname_of_file="file.doc";matchfind(name_of_file,'.'){None=>println!("Extension could not be found."),Some(i)=>println!("The extension of file is: {}",&name_of_file[i+1..]),}}

输出:

The extension of file is: doc

请注意,panic 可以使用 expect 手动自定义,但 unwrap 产生的相关输出少于显式处理。在下面的示例中,显式处理会产生更受控制的结果,同时在需要时保留 panic 选项。

fn adult_man(food: Option<&str>){matchfood{Some("pasta")=>println!("The food does not taste right."),Some(inner)=>println!("{}? It could be nice.",inner),None=>println!("No good food? Nevertheless."),}}fn food(food: Option<&str>){letinterior=food.unwrap();ifinterior=="pasta"{panic!("Ummmmmm!!!!");}println!("I am glad to have {}s!!!!!",interior);}fn main(){letbruschetta=Some("Bruschetta");letpasta=Some("pasta");letvoid=None;adult_man(bruschetta);adult_man(pasta);adult_man(void);letspaghetti=Some("spaghetti");letnothing=None;food(spaghetti);food(nothing);}

首先,在上述代码中,所有食物都使用 match 明确处理。

所有食物都使用 unwrap 作为部分功能隐式处理。Unwrap 在收到 none 时返回 panic

输出:

Bruschetta? It could be nice.
The food does not taste right.
No good food? Nevertheless.
I am glad to have spaghettis!!!!!

Result 类型

ResultOption 的更强大的版本。与表示缺席可能性的 Option 不同,Result 表示错误的可能性。

该错误通常用于指示计算执行失败的原因。这是单词 Option 的一般形式。

语法:

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