9 个版本
0.1.8 | 2023 年 2 月 1 日 |
---|---|
0.1.7 | 2023 年 1 月 29 日 |
在 Rust 模式 中排名第 1692
每月下载 65 次
在 5 个crate中(4个直接使用)使用
7KB
73 行
孵化结果
一个在 std::result::Result
之上的包装器,在 ?
操作符使用时返回 Ok
而不是 Err
。
内置 Result
对 ?
操作符的实现模仿了逻辑 and 上的短路:如果某个操作返回错误,则立即从函数返回。如果没有,则继续执行下一个语句。
HatchResult
对 ?
操作符的实现模仿了逻辑 or 上的短路:如果某个操作返回 Ok
,则立即从函数返回。如果没有,则继续执行下一个语句。
此 crate 还在内置的 Result
类型上实现了一个 hatch
方法,它将值包装在一个 HatchResult
中。
示例
典型用例
fn operation1() -> Result<u32, String> {
Ok(4)
// Err("Some error occurred")
}
fn operation2() -> Result<u32, String> {
Ok(4)
// Err("Some error occurred")
}
fn exit_early_if_possible() -> Result<u32, String> {
let err1 = operation1().hatch()?;
let err2 = operation2().hatch()?;
handle_errors(err1,err2)
}
fn handle_errors(err1: String, err2: String) -> Result<u32, String> {
Err(format!("Both operations failed:\n\top1: {err1}\n\top2: {err2}"))
}
改进匹配
HatchResult 更简洁(但等效)于传统方法
fn exit_early_if_possible() -> Result<u32, String> {
let err = match operation1() {
Err(error) => error,
ok_result => return ok_result
};
// ...
}
常规 Result
和 HatchResult
之间的区别
fn regular_result() -> Result<u32, String> {
let value: u32 = Result::<u32, String>::Ok(4)?;
Ok(value)
}
fn hatch_result() -> Result<u32, String> {
let err: String = HatchResult::<u32, String>(Ok(3))?;
Err(err)
}
从 Result
转换
hatch
方法 "转换" 结果到 HatchResult
。
这允许你在 Ok
结果上提前退出或处理错误。
fn operation_that_might_fail() -> Result<u32, String> {
let result = // ... some computation
result
}
fn hatch_result() -> Result<u32, String> {
let error = operation_that_might_fail().hatch()?;
panic!("There was an error: {error}");
}