Unwrap 及其在 Rust 中的使用

Nilesh Katuwal 2022年6月7日
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() {
    let name_of_file = "file.doc";
    match find(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>) {
    match food {
        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>) {
    let interior = food.unwrap();
    if interior == "pasta" { panic!("Ummmmmm!!!!"); }

    println!("I am glad to have {}s!!!!!", interior);
}

fn main() {
    let bruschetta  = Some("Bruschetta");
    let pasta = Some("pasta");
    let void  = None;

    adult_man(bruschetta);
    adult_man(pasta);
    adult_man(void);

    let spaghetti = Some("spaghetti");
    let nothing = 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),
}