#unwrap #expect #sugar #syntactic #panic-message

无 std unwrap_all

一次性展开多个层级的 Result<T, E>Option<T>

2 个不稳定版本

0.2.0 2020 年 9 月 24 日
0.1.0 2020 年 9 月 24 日

#7#syntactic

MIT/Apache

7KB
83 代码行数(不含注释)

unwrap_all

crates.io docs.rs

使用这个crate,我想探讨使用一个调用就能展开多层的便利性。

示例 unwrap_all!(n_times, expression)

use unwrap_all::unwrap_all;

let nested: Option<Result<Option<Result<usize, ()>>, ()>> = Some(Ok(Some(Ok(42))));

let unpacked = unwrap_all!(4, nested);

assert_eq!(42, unpacked);

示例 expect_all!(n_times, message, expression)

运行此函数将引发一个包含消息 1 - must fail: 23 的panic,其中 1 表示panic中引起的层数。

use unwrap_all::expect_all;

fn must_fail() {
    let var = Some(Err::<usize, isize>(23));
    let _result: usize = expect_all!(2, "must fail", var);
}

lib.rs:

一次性展开多个层级的 Result<T, E>Option<T>

use unwrap_all::unwrap_all;

let nested: Option<Result<Option<Result<usize, ()>>, ()>> = Some(Ok(Some(Ok(42))));
let unpacked = unwrap_all!(4, nested);
assert_eq!(42, unpacked);

这个crate也应该与 no_std 兼容。

依赖项

~81KB