Unwrap 及其在 Rust 中的使用
Nilesh Katuwal
2022年6月7日
Rust
Rust Unwrap
本文将介绍 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),
}
Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe