matches_or

Macro matches_or 

Source
macro_rules! matches_or {
    ($ex:expr, $pat:pat $(if $guard:expr)? => $result:expr, $or_else:expr) => { ... };
    (? $ex:expr, $($pat:pat $(if $guard:expr)? => $some_value:expr),* $(,)?) => { ... };
    ($ex:expr, $($pat:pat $(if $guard:expr)? => $result:expr),*; $($rest:tt)*) => { ... };
}
Expand description

§匹配某个值,或返回另一个值

  • 🎯缩减某些match x {a => b, _ => c}的模板代码
  • 🎯便于对Option操作:符合某模式返回Some,不符合返回None
use nar_dev_utils::matches_or;
// 普通二元形式:匹配返回result,否则返回or_else
let g = |a| matches_or!(a, i @ 1.. => [i+1], [0]);
assert_eq!(g(1), [2]);
assert_eq!(g(2), [3]);
assert_eq!(g(3), [4]);
assert_eq!(g(0), [0]);
assert_eq!(matches_or!(1, 1 => 1, 2), 1);
assert_eq!(matches_or!(2, x if x < 1 => 1, 2), 2);
assert_eq!(matches_or!(Some(1), None => 1, 2), 2);
assert_eq!(matches_or!((1, 2, 3), (.., 3) => 1, 2), 1);
assert_eq!(matches_or!((1, 2, 3), (.., x) if x > 3 => 1, 2), 2);

// Option二元形式:匹配返回指定代码,不匹配返回None
assert_eq!(matches_or!(?[2, 2], [1..=2, _] => 1), Some(1));
assert_eq!(matches_or!(?[2, 2], [.., 1] | [1, ..] => 1), None);

// 一般多元形式
let f = |a| {
    matches_or! {
        a,
        (1, 2, 3) => 1,
        (1, 2, 4) => 2,
        (1, 2, 5) => 3;
        0
    }
};
assert_eq!(f((1, 2, 3)), 1);
assert_eq!(f((1, 2, 4)), 2);
assert_eq!(f((1, 2, 5)), 3);
assert_eq!(f((0, 0, 0)), 0);