匹配具有多个可能值的元组

时间:2016-08-26 06:41:09

标签: pattern-matching rust tuples

由于与范围匹配的元组起作用,我希望类似的东西也适用于替代方案:

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而不是模式匹配?

1 个答案:

答案 0 :(得分:12)

替代品不是模式语法的一部分; a | b不是一种模式。替代方案只能用于组合match手臂中的模式(它们在if letwhile 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")
}