#guard #swift #macro #option-t #syntax #value #early

ward

提供了一个 ward! 宏,它返回 Option 的内容,否则提前返回,以及一个 guard! 宏,它执行相同的操作,但语法更类似于 Swift 的 guard 语法。

6 个稳定版本

2.1.0 2019 年 9 月 16 日
2.0.0 2019 年 9 月 16 日
1.1.0 2019 年 9 月 9 日
1.0.2 2019 年 9 月 9 日

#1192Rust 模式

Download history 805/week @ 2024-03-14 1632/week @ 2024-03-21 1097/week @ 2024-03-28 859/week @ 2024-04-04 653/week @ 2024-04-11 737/week @ 2024-04-18 637/week @ 2024-04-25 845/week @ 2024-05-02 896/week @ 2024-05-09 868/week @ 2024-05-16 727/week @ 2024-05-23 666/week @ 2024-05-30 743/week @ 2024-06-06 574/week @ 2024-06-13 699/week @ 2024-06-20 518/week @ 2024-06-27

2,640 每月下载量
2 个 crate 中使用(通过 onagre-launcher-plugins

MIT 许可证

10KB

ward

Crates.io Crates.io Crates.io Docs.io

此 crate 导出两个宏,旨在复制 Swift 的 guard 表达式的功能,与 Option<T>

guard! 宏是为了模拟 Swift 中的 guard let 语句而创建的。此宏仅对将值从 Option<T> 移动到变量中非常有用。另一方面,ward! 宏不会强制创建变量,它只返回 guard! 变量会放入变量的值。因此,它是 guard! 宏的更灵活版本;也许也是 Rustic 的一方面。

示例

let sut = Some("test");

// This creates the variable res, which from an Option<T> will return a T if it is Some(T), and will
// otherwise return early from the function.
guard!(let res = sut);
assert_eq!(res, "test");

ward! 宏相比,它只是返回值,不会强制您从它创建变量(尽管我们在这个例子中仍然这样做)

let sut = Some("test");
let res = ward!(sut);
assert_eq!(res, "test");

这两个宏也支持一个 else 分支,如果 Option<T>None,则会运行此分支

let sut = None;
guard!(let _res = sut, else {
    println!("This will be called!");

    // Because sut is None, the else branch will be run. When the else branch is invoked, guard!
    // no longer automatically returns early for you, so you must do so yourself if you want it.
    return;
});
unreachable!();

这两个宏还支持一个替代的“早期返回语句”,这可以让您在循环中执行例如 break

// Not that you couldn't (and probably should) do this case with `while let Some(res) = sut`...
let mut sut = Some(0);
loop {
    let res = ward!(sut, break);
    sut = if res < 5 {
        Some(res + 1)
    } else {
        None
    }
}
assert_eq!(sut, None);

无运行时依赖