一、 什麼是Rustunwrap
Rustunwrap是一個輕量級的處理rust語言中錯誤的crate。Rust編程語言通過Result類型來處理錯誤,使用Rustunwrap可以使處理Result類型的代碼更加簡介。它是一個通用的處理Result類型的crate,可以應用在各種場景中。
二、 Rustunwrap的優點
1、 簡單易用:
let data = fetch_data() ?;
有了Rustunwrap之後,可以將上述代碼簡化為:
let data = unwrap!(fetch_data());
2、 統一:
在Rust代碼中使用unwrap方法編寫錯誤處理代碼時,代碼風格不統一,Rustunwrap解決了這個問題,使你的代碼風格更加整潔。
3、 優雅的錯誤信息提示:
使用unwrap!宏的時候,你可以自定義你的錯誤提示:
let data = unwrap!(fetch_data(), "Failed to fetch data");
三、 Rustunwrap常用方法
unwrap!
unwrap!宏是Rustunwrap中最常用的一個,它允許我們以更簡潔的方式處理Result類型的錯誤,如果Result類型為Ok,則返回Ok中的值,否則它會panic並打印出錯誤消息。
let data = unwrap!(fetch_data());
unwrap!宏還可以附加錯誤消息,如下所示:
let data = unwrap!(fetch_data(), "Failed to fetch data");
expect!
expect!宏與unwrap!宏基本相同,它們之間的區別在於,如果unwrap!宏觸發錯誤,它會打印默認消息 。而expect!宏可以自定義錯誤消息,這使得錯誤消息更易讀。
let data = expect!(fetch_data(), "Failed to fetch data: {}", e);
chain!
通常情況下,我們使用map或and_then方法對返回值進行操作,這使代碼更加整潔。但是,當操作多個可能失敗的函數時,這會變得很繁瑣。Chain!宏在這種情況下非常有用。
let res = chain!(
fetch_data().map(|data| process_data(data)),
fetch_config().map(|cfg| process_cfg(cfg))
);
ensure!
如果需要在結果為Ok時執行某些操作,但是在結果為Err時,確保鉤子函數被執行,則可以使用ensure!宏:
let mut config = Config::new()?;
ensure!(config.is_valid(), "Invalid configuration")?;
config.save()?;
unwrap_err!
unwrap_err!宏與unwrap!宏相似,它返回結果的Err部分。如果結果是Ok,則它會panic。
let mut config = Config::new()?;
config.set("name", "John")?;
let value = unwrap_err!(config.get("wrong_name"));
println!("{}", value);
四、 完整代碼示例
use rustunwrap::*;
fn fetch_data() -> Result{
Ok(String::from("data"))
}
fn fetch_config() -> Result{
Err(String::from("Failed to fetch"))
}
fn config_ok(cfg: String) -> Result {
Ok(cfg)
}
fn process_data(data: String) -> String {
data
}
fn process_cfg(cfg: String) -> String{
cfg
}
struct Config {}
impl Config {
fn new() -> Result{
Ok(Self{})
}
fn is_valid(&self) -> bool{
true
}
fn set(&mut self, key: &str, value: &str) -> Result {
Ok(())
}
fn get(&self, key: &str) -> Result{
Err(String::from("Invalid key"))
}
fn save(&self) -> Result{
Ok(())
}
}
fn main() {
let data = unwrap!(fetch_data());
println!("{}", data);
let mut config = Config::new().unwrap();
ensure!(config.is_valid(), "Invalid configuration").unwrap();
config.save().unwrap();
let res = chain!(fetch_data().map(|data| process_data(data)),fetch_config().map(|cfg| process_cfg(cfg)));
println!("{}", res.unwrap_err());
let value = unwrap_err!(config.get("wrong_name"));
println!("{}", value);
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/183597.html