#match #macro-helpers #macro #helper

no-std matrix_match

同时匹配两个值的宏

1 个稳定版本

1.0.0 2023 年 2 月 6 日

#2538Rust 模式

MIT/Apache

12KB
203

矩阵匹配

此软件包提供了一个宏,可以轻松同时匹配两个值。

该宏接受一个结果的矩阵和行与列的模式。匹配模式的交叉处的表达式被执行并可能返回。

此软件包可以在无 std 环境中使用。

示例

use matrix_match::matrix_match;

#[derive(Debug, PartialEq, Eq, Copy, Clone)]
enum Light {
    Red,
    Orange,
    Green,
}

fn next(light: Light, car_waiting: bool) -> Light {
    use Light::*;
    matrix_match!(
        (light, car_waiting) ; true  , false =>
        Red                 => Green , Red    ;
        Orange              => Red   , Red    ;
        Green               => Green , Orange ;
    )
}

fn main() {
    assert_eq!(next(Light::Red,    true ), Light::Green);
    assert_eq!(next(Light::Red,    false), Light::Red);

    assert_eq!(next(Light::Orange, true ), Light::Red);
    assert_eq!(next(Light::Orange, false), Light::Red);

    assert_eq!(next(Light::Green,  true ), Light::Green);
    assert_eq!(next(Light::Green,  false), Light::Orange);
}

实现细节

该宏首先为行模式创建一个匹配,然后为每一行创建一个列模式的匹配。在 single-match 分支中存在一个实现,它只创建一个匹配。经过一些基准测试(也在那个分支中),确定两种实现运行时速度相当,因此选择了更简单的那个。

无运行时依赖