#result #return-early #ok-early #question-mark #from-residual

nightly hatch_result

当使用 ? 操作符时,返回 Ok 而不是 Err 的类似结果的 struct

9 个版本

0.1.8 2023 年 2 月 1 日
0.1.7 2023 年 1 月 29 日

Rust 模式 中排名第 1692

Download history 25/week @ 2024-03-11 25/week @ 2024-03-18 12/week @ 2024-03-25 38/week @ 2024-04-01 12/week @ 2024-04-08 13/week @ 2024-04-15 21/week @ 2024-04-22 22/week @ 2024-04-29 15/week @ 2024-05-06 18/week @ 2024-05-13 22/week @ 2024-05-20 11/week @ 2024-05-27 15/week @ 2024-06-03 17/week @ 2024-06-10 15/week @ 2024-06-17 17/week @ 2024-06-24

每月下载 65
5crate中(4个直接使用)使用

MIT 许可证

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
    };
    // ... 
}

常规 ResultHatchResult 之间的区别

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

无运行时依赖