#ignore #productivity #result #error-value

无 std ignore-result

为函数调用添加了一个 Result<_, _>.ignore() 方法,在出错时不会引发恐慌,从而忽略函数调用的返回值

2 个不稳定版本

0.2.0 2018 年 12 月 24 日
0.1.0 2018 年 12 月 24 日

#392无标准库

Download history 36473/week @ 2024-03-14 39351/week @ 2024-03-21 48455/week @ 2024-03-28 48276/week @ 2024-04-04 56562/week @ 2024-04-11 54241/week @ 2024-04-18 52542/week @ 2024-04-25 57390/week @ 2024-05-02 56663/week @ 2024-05-09 59939/week @ 2024-05-16 65783/week @ 2024-05-23 77601/week @ 2024-05-30 77500/week @ 2024-06-06 70955/week @ 2024-06-13 61375/week @ 2024-06-20 72117/week @ 2024-06-27

302,201 每月下载量
14 Crates 中使用(直接使用 7 个)

MIT 许可证

6KB

ignore-result 适用于 rust

在结果不重要时安全地忽略函数返回值中的错误

crates.io docs.rs

此 crate 为 Result 实例添加了一个 .ignore() 函数,该函数忽略结果的 OkErr 变体,在不使用空 match 块的情况下抑制编译器关于未使用错误的警告,并且在调用 .unwrap() 时不会引发恐慌。

为什么你需要这个?

在某些涉及正确错误处理的情况下,即使调用失败,也希望调用方法并继续执行,这在与 C APIs 或嵌入式系统进行 FFI 接口时很常见。

作为一个具体的例子,假设你已经捕获了一个错误,需要将其冒泡到调用者那里,但在那之前,你需要尽力清理一些资源分配等。

如果你这样做

fn my_func() -> Result<(), E> {
    let foo = something_important()?;
    if foo.is_err() {
        // Oh no! We can't continue, need to report this error,
        // but first, try to clean up some state
        cleanup()?;
    }
    return foo;
}

如果在 foo 中原始错误在执行 cleanup() 失败时丢失(因为 ? 会触发一个带有 cleanup() 返回值的早期中止,而不是 foo 中的原始错误 Err(e))。

如果您省略了 ?,则编译器会警告您存在未检查/使用的结果,因为 cleanup() 可能会失败。

这是一个“尽力而为”的场景,您 希望 函数成功,如果它没有成功,您无能为力,而且有一个更高优先级的结果(错误)应该即使在此步骤失败时也保持不变。

因此,您可以这样做

let foo = something_import();
if foo.is_err() {
    match cleanup() {
        _ => {}
    };

    return foo;
}

或者使用这个crate并这样写

use ignore_result::Ignore;

if foo.is_err() {
    cleanup.ignore();
    return foo;
}

然后就可以继续前行了。

为什么这是安全的?

调用 foo().ignore() 返回 (),无论 foo() 是否评估为 Ok(_)Err(_) -- 这意味着它保证您不会(错误地)依赖一个 Ok(_))结果。

ignore 函数实际上消耗了 Result(被声明为 fn ignore(self) -> ()),保证在调用 foo().ignore() 之后,无法获取原始结果的 OkErr 变体,这反过来意味着调用者无法“假设它是 Ok 并使用返回值”(这是使用 monads 而不是 exceptions 的原始动机),并且它还使您的意图更清晰。

无运行时依赖