Macro nar_dev_utils::matches_or
source · macro_rules! matches_or { ($ex:expr, $pat:pat => $result:expr, $or_else:expr) => { ... }; (? $ex:expr, $($pat:pat => $some_value:expr),* $(,)?) => { ... }; ($ex:expr, $($pat:pat => $result:expr),*; $($rest:tt)*) => { ... }; }
Expand description
匹配某个值,或返回另一个值
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, 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);
// 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);