随着元组与范围匹配的工作,我希望类似的东西也能与替代品一起工作:

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

推荐答案

备选方案不是模式语法的一部分;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")
}

Rust相关问答推荐

在actix—web中使用Redirect或NamedFile响应

包含嵌套 struct 的CSV

Rust中的相互递归特性与默认实现

在函数内定义impl和在函数外定义impl的区别

rust 蚀生命周期 行为

在特征中使用Async时,如何解决不透明类型`impl Future<;out=self>;`不满足其关联的类型边界和警告?

为什么std repeat trait绑定在impl块和关联函数之间?

编译项目期间使用Cargo生成时出现rustc错误

我应该将哪些文件放入我的GitHub存储库

在文件链实施中绕过borrow 判断器

如何在嵌套的泛型 struct 中调用泛型方法?

根据填充系数以相对大小在给定空间中布局项目

确保参数是编译时定义的字符串文字

将特征与具有生命周期的关联类型一起使用时的生命周期方差问题

中文优化标题:跳出特定循环并返回一个值

‘&T as *const T as *mut T’ 在 ‘static mut’ 项目中合适吗?

max(ctz(x), ctz(y)) 有更快的算法吗?

更好的方法来模式匹配带有 Rust 的窥视孔装配说明窗口?

有没有办法阻止 rust-analyzer 使非活动代码变暗?

为什么分配对变量的引用使我无法返回它