#statement #macro #语法 #match #嵌套 #条件 #优雅

cond

Rust 宏,用于以类似 match 的语法作为嵌套 if-else 语句的优雅替代方案

5 个稳定版本

1.0.5 2023 年 11 月 24 日
1.0.3 2023 年 11 月 23 日

#587Rust 模式

每月 33 次下载

MIT 许可证

7KB

cond

cond 是一个 Rust 宏,用于以类似 match 的语法作为多个 if-else 语句的优雅替代方案。

我从空的 Go switch 语句 得到这个想法。我想,如果它在 Rust 中实现会很有趣,所以我就在 Rust 社区 Discord 服务器上询问是否可行。他们告诉我,除非你在 match 中使用非常丑陋的语法,否则不可能实现,Esper89(GitHub 上的致谢)为此创建了一个宏。我添加了一些测试和文档,这就是我的第一个 Rust crate。

示例

use cond::cond;

fn main() {
    let a = 195;
    cond! {
        a < 5 => println!("a is less than 5"),
        a == 195 => {
            println!("this is the way")
        },
        a > 10 => println!("a is greater than 10"),

        // The conditions are executed by order: if one condition is true, conditions below will not get evaluated
    };

    let b = "";
    let result = cond! { // Or use it as a block to return a value
        b == "something" => false,
        b.chars().count() > 10 => true,
        a < 10000 => true,
        _ => false // You must add a default with the return type if you want to return
    };

    println!("result: {}", result);
}

用法

您可以通过以下方式添加该 crate:

cargo add cond

或者,只需将 8 行宏添加到您的项目中

macro_rules! cond {
    ($($condition:expr => $value:expr),* $(, _ => $default:expr)? $(,)?) => {
        match () {
            $(() if $condition => $value,)*
            () => ($($default)?),
        }
    };
}

致谢

感谢 Esper89 在 Rust 社区 Discord 服务器中基本上创建了整个宏。

无运行时依赖项