一、 什么是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/n/183597.html