当类型判断表情匹配e_s { a_1 => e_1, ... a_n => e_n }时,对于包含形式p_i | q_i的图案的每个匹配臂a_i,如果在其存在深度d处的e_s的片段的深度d处,表情片段的类型与p_i | q_i不一致,则图案p_i | q_i被认为是病态的.

资料来源:https://doc.rust-lang.org/stable/reference/patterns.html#or-patterns

我试图为这种不规范的情况创造一个例子,我的方法是这样的

fn main() {
    let v = 10;

    match v {
        1 | 2 => 2.0,
        3 | 4 => 4.0,
        5 | 6 => 6.0,
        _ => 0.0,
    };
}

但这是正确的,为什么不是呢?我可能就是不明白.为什么手臂或模式类型应该与表达式类型统一?或者他们所说的统一到底是什么意思?

什么是正确的例子来证明上述规则的有效性?

推荐答案

我认为这段话的意思是,匹配的对象部分和匹配条件应该始终在类型上匹配,即使您匹配对象的某些深层部分,例如,本例有2个有效分支和1个无效分支(最后),因为类型Some(42) | Some(43)Option<i32>,而此模式匹配类型BOption<A>部分.

struct A(i32);
struct B(Option<A>);

fn main(){
    let b = B(Some(A(42)));
    match b {
        B(Some(A(42) | A(43))) => println!("ok 1"),
        B(Some(A(42)) | None) => println!("ok 2"),
        B(Some(42) | Some(43)) => println!("err"),
    }
}

Rust相关问答推荐

如何在Rust中为具有多个数据持有者的enum变体编写文档 comments ?

将内部类型作为参数的泛型 struct 上的方法

如何在原始字符串中转义";#和#";

在自身功能上实现类似移动的行为,以允许通过大小的所有者进行呼叫(&;mut;self)?

亚性状上位性状上的 rust 病伴生型界限

防止cargo test 中的竞争条件

为什么这是&q;,而让&q;循环是无限循环?

什么是`&;[][..]`铁 rust 里的刻薄?

在使用粗粒度锁访问的数据 struct 中使用 RefCell 是否安全?

Rust 中的静态引用

使用 pyo3 将 Rust 转换为 Python 自定义类型

为什么 js_sys Promise::new 需要 FnMut?

使用占位符获取用户输入

sha256 摘要仅适用于 &*

从Rust 的临时文件中创建引用是什么意思?

如何在 Rust 中按 char 对字符串向量进行排序?

如何限制通用 const 参数中允许的值?

判断 is_ok 后重用结果

无法把握借来的价值不够长寿,请解释

为什么 `ref` 会导致此示例*取消引用*一个字段?