#guard #try #macro

try-guard

受Haskell的guard替代函数启发的guard!宏

3个不稳定版本

0.2.0 2019年6月7日
0.1.1 2019年5月7日
0.1.0 2019年5月7日

1346Rust模式 中排名

Download history 33/week @ 2024-03-24 86/week @ 2024-03-31 21/week @ 2024-04-07 37/week @ 2024-04-14 62/week @ 2024-04-21 26/week @ 2024-04-28 20/week @ 2024-05-05 42/week @ 2024-05-12 54/week @ 2024-05-19 38/week @ 2024-05-26 47/week @ 2024-06-02 44/week @ 2024-06-09 139/week @ 2024-06-16 28/week @ 2024-06-23 29/week @ 2024-06-30 110/week @ 2024-07-07

每月下载 314
用于 3 crate

BSD-3-Clause

9KB

将Haskell的guard Alternative函数引入Rust的guard函数

guard!宏。

guard!宏实现了一个在常见Rust代码中经常出现的控制流糖

fn foo(cond: bool) -> Option<i32> {
  if !cond {
    return None;
  }

  // do something useful

  Some(42)
}

这种测试参数和早期返回错误的模式非常典型。不幸的是,?运算符在这里帮不了我们,因为我们想要在一个布尔值上早期返回,而不是错误值。

重写这种方式不是很习惯和奇怪

fn foo(cond: bool) -> Option<i32> {
  if cond { Some(()) } else { None }?;
  Some(42)
}

此crate提供guard!宏——类似于Haskell的guard Alternative函数——如果谓词为false,则帮助从函数中早期返回


use try_guard::guard;

fn foo(cond: bool) -> Option<i32> {
  guard!(cond);
  Some(42)
}

自定义guard类型

此crate还允许您将guard应用于任何实现了Try<Error = NoneError>的类型。例如,以下是可以工作的


use std::ops::Try;
use std::option::NoneError;
use try_guard::guard;

enum MyGuard<T> {
  Just(T),
  Nothing
}

impl<T> MyGuard<T> {
  fn new(x: T) -> Self {
    MyGuard::Just(x)
  }

  fn none() -> Self {
    MyGuard::Nothing
  }
}

impl<T> Try for MyGuard<T> {
  type Ok = T;

  type Error = NoneError;

  fn from_error(_: Self::Error) -> Self {
    MyGuard::none()
  }

  fn from_ok(x: Self::Ok) -> Self {
    MyGuard::new(x)
  }

  fn into_result(self) -> Result<Self::Ok, Self::Error> {
    match self {
      MyGuard::Just(x) => Ok(x),
      MyGuard::Nothing => Err(NoneError)
    }
  }
}

fn foo(cond: bool) -> MyGuard<i32> {
  guard!(cond);
  MyGuard::new(42)
}

功能标志

  • 可以使用test-nightly功能标志来测试与nightly相关的功能,这些功能免费提供,不需要编译此crate的rustc nightly版本,但需要在使用站点使用时才需要。

无运行时依赖

功能