Unwrap 及其在 Rust 中的使用
Nilesh Katuwal
2022年6月7日
本文将介绍 unwrap
及其在 Rust 中的使用。
Rust 中的 unwrap
在 Rust 中,unwrap
意味着发出以下命令:给我计算结果,如果有错误,恐慌并停止程序。
因为解包是一个非常简单的过程,所以演示它的代码对我们是有益的。
但是,我们需要先调查 Option
和 Result
类型,然后才能执行此操作。
Option
类型
Option
类型是一种使用 Rust 类型系统表达缺席可能性的方法。将缺席的可能性编码到类型系统中是至关重要的,因为它迫使编译器强制程序员处理缺席。
如果可能不存在,则使用 std
库中名为 Option<T>
的 enum
。它采用两个选项
之一的形式。
Some(T)
- 已识别类型T
的元素。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
类型
Result
是 Option
的更强大的版本。与表示缺席可能性的 Option
不同,Result
表示错误的可能性。
该错误通常用于指示计算执行失败的原因。这是单词 Option
的一般形式。
语法:
enum Result<T, E> {
Ok(T),
Err(E),
}