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),
}