#unwrap #safe #macro #fail #unwrapping #require #annotating

no-std safe_unwrap

safe_unwrap crate 允许安全地解包并标注解包永远不会失败。不需要 std

6 个版本 (3 个破坏性更新)

使用旧的 Rust 2015

0.4.1 2018 年 4 月 10 日
0.4.0 2018 年 3 月 13 日
0.3.1 2018 年 3 月 13 日
0.2.0 2017 年 4 月 26 日
0.1.1 2016 年 12 月 30 日

#1630Rust 模式

MIT 许可证

9KB
133

safe_unwrap

safe_unwrap 宏允许安全地解包并标注解包永远不会失败。

示例

#[macro_use]
extern crate safe_unwrap;

fn main() {
  let res = Some(42);

  // we know that unwrapping res will never fail, so it is safe to call unwrap
  let val = safe_unwrap!("is constant value", res);

  assert_eq!(val, 42);
}

在发布构建中,safe_unwrap!(expr) 等同于 expr.unwrap();在调试构建中,expect() 将调用一个消息,指出假设的不变量已被违反。

该 crate 不需要 std


lib.rs:

手动检查解包

safe_unwrap 宏允许安全地解包并标注解包永远不会失败。

示例

#[macro_use]
extern crate safe_unwrap;

fn main() {
   let res = Some(42);

   // we know that unwrapping res will never fail, so it is safe to call unwrap
   let val = safe_unwrap!("is constant value", res);

   assert_eq!(val, 42);
}

在发布构建中,safe_unwrap!(expr) 等同于 expr.unwrap();在调试构建中,expect() 将调用一个消息,指出假设的不变量已被违反。

作为替代,对于 ResultOption 类型,你可以以较小的开销换取更简洁的语法

extern crate safe_unwrap;
use safe_unwrap::SafeUnwrap;

fn main() {
    let res = Some(42);

    // works only for Result and Option types
    let val = res.safe_unwrap("is constant value");

    assert_eq!(val, 42);

    #[cfg(feature = "std")]
    {
        // With `std`, two additional methods are available.
        let val = res.unwrap_or_abort("is constant value");
        assert_eq!(val, 42);
        let val = res.unwrap_or_exit("is constant value");
        assert_eq!(val, 42);
    }
}

.safe_unwrap 的语义与 safe_unwrap! 宏相同。这里的权衡是你必须依赖 LLVM 优化器来从生成的可执行文件中移除未使用的静态字符串 "is constant value"(通常在发布模式下有效)。

std 支持

默认情况下,支持 no_std。使用 std 功能,SafeUnwrap 有两个额外的函数,它们需要标准库。它们与 safe_unwrap 的工作方式相同,但

  • unwrap_or_abort 会终止进程而不是引发恐慌。
  • unwrap_or_exit 会以代码 1 退出而不是引发恐慌。

无运行时依赖

特性