3个不稳定版本
0.2.0 | 2019年6月7日 |
---|---|
0.1.1 | 2019年5月7日 |
0.1.0 | 2019年5月7日 |
1346 在 Rust模式 中排名
每月下载 314 次
用于 3 crate
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版本,但需要在使用站点使用时才需要。