由于与范围匹配的元组起作用,我希望类似的东西也适用于替代方案:
match x {
(1, 1) => println!("A"),
(1, 2 ... 3) => println!("B"), // ranges work
(2 | 5, 4 | 6) => println!("C"), // this doesn't
_ => println!("D")
}
是否有一个优雅的解决方案,或者是否需要"展开"替代方案或采用链式if
/ else if
而不是模式匹配?
答案 0 :(得分:12)
替代品不是模式语法的一部分; a | b
不是一种模式。替代方案只能用于组合match
手臂中的模式(它们在if let
和while let
表达式中不可用。)
解决方法是使用警卫:
match x {
(1, 1) => println!("A"),
(1, 2 ... 3) => println!("B"),
(a, b) if (a == 2 || a == 5) &&
(b == 4 || b == 6) => println!("C"),
_ => println!("D")
}
Guards是任意表达式(必须求值为bool
),因此可以调用函数。
match x {
(1, 1) => println!("A"),
(1, 2 ... 3) => println!("B"),
(a, b) if [2, 5].contains(&a) &&
[4, 6].contains(&b) => println!("C"),
_ => println!("D")
}