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}");
}