5 个版本 (稳定版)

使用旧 Rust 2015

1.2.1 2018 年 8 月 8 日
1.2.0 2018 年 6 月 28 日
1.1.0 2016 年 6 月 2 日
1.0.0 2016 年 3 月 9 日
0.2.0 2016 年 6 月 1 日

#254调试

Download history 8710/week @ 2023-10-15 8910/week @ 2023-10-22 8310/week @ 2023-10-29 8661/week @ 2023-11-05 6791/week @ 2023-11-12 5038/week @ 2023-11-19 5400/week @ 2023-11-26 6908/week @ 2023-12-03 4905/week @ 2023-12-10 4044/week @ 2023-12-17 1559/week @ 2023-12-24 4600/week @ 2023-12-31 6771/week @ 2024-01-07 5752/week @ 2024-01-14 5516/week @ 2024-01-21 5593/week @ 2024-01-28

24,067 每月下载量
119 个代码包中 使用(78 个直接使用)

MIT 或 BSD-3-Clause 许可证

17KB
206

Rust 的 unwrap! 宏。

该代码包提供了两个宏,unwrap!unwrap_err!。前者可用于展开 ResultOption(或任何实现了 VerboseUnwrap 的类型)的值,相当于调用 unwrap()。后者可用于展开 Result(或任何实现了 VerboseUnwrapErr 的类型)的错误,相当于调用 unwrap_err()

使用这些宏而不是 .unwrap().expect().unwrap_err().expect_err() 方法的好处是,在 panic 时,它们会打印出宏被调用的文件名、行号、列号和函数名。

文档

示例

此代码

let x: Result<(), u32> = Err(123);
let y = unwrap!(x);

会引发以下消息的 panic


!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!   unwrap! called on Result::Err                                              !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
example.rs:2,9 in example_module::example_function

Err(123)

unwrap! 也可以带有一个可选的错误消息。这是一个格式字符串和参数。

let x: Option<()> = None;
let y = unwrap!(x, "Oh no! {}", 123);

打印


!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!   unwrap! called on Option::None                                             !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
example.rs:2,9 in example_module::example_function
Oh no! 123

类似地,对于 unwrap_err! 此代码

let x: Result<u32, ()> = Ok(456);
let y = unwrap_err!(x);

会引发以下消息的 panic


!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!   unwrap_err! called on Result::Ok                                           !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
example.rs:2,9 in example_module::example_function

Ok(456)

实现

unwrap 代码包为可展开的类型提供了一个 trait。

trait VerboseUnwrap {
    type Wrapped;
    fn verbose_unwrap(self, message: Option<std::fmt::Arguments>,
                            module_path: &str,
                            file: &str,
                            line_number: u32,
                            column: u32) -> Self::Wrapped;
}

这通过 ResultOption 两种方式实现。宏 unwrap! 简单地调用了这个特质的这个方法

macro_rules! unwrap(
    ($e:expr) => (
        $crate::VerboseUnwrap::verbose_unwrap($e, None, module_path!(), file!(), line!(), column!())
    );
    ($e:expr, $($arg:tt)*) => (
        $crate::VerboseUnwrap::verbose_unwrap($e, Some(format_args!($($arg)*)), module_path!(), file!(), line!(), column!())
    );
);

同样,还有一个特质用于可以展开内部错误类型的类型。

pub trait VerboseUnwrapErr {
    type Wrapped;
    fn verbose_unwrap_err(self, message: Option<Arguments>,
                                module_path: &str,
                                file: &str,
                                line_number: u32,
                                column: u32) -> Self::Wrapped;
}

这通过 Result 实现,而宏 unwrap_err! 调用了这个特质的方法

macro_rules! unwrap_err(
    ($e:expr) => (
        $crate::VerboseUnwrapErr::verbose_unwrap_err($e, None, module_path!(), file!(), line!(), column!())
    );
    ($e:expr, $($arg:tt)*) => (
        $crate::VerboseUnwrapErr::verbose_unwrap_err($e, Some(format_args!($($arg)*)), module_path!(), file!(), line!(), column!())
    );
);

用法

将此添加到 Cargo.toml 的依赖项中

unwrap = "~1.1.0"

然后使用 #[macro_use] 导入它

#[macro_use]
extern crate unwrap;

没有运行时依赖