rust 保护如何影响匹配语句?

velaa5lx  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(100)

我简化了一个例子,出现在学习生 rust 的例子-警卫:https://doc.rust-lang.org/rust-by-example/flow_control/match/guard.html

let number: u8 = 4;

    match number {
        i if i == 0 => println!("Zero"),
    }
}

上面的例子导致了一个编译错误,因为匹配的情况不全面。我不知道为什么。文章说“注意,当检查匹配表达式是否覆盖了所有模式时,编译器不会考虑保护条件。”但是下面的例子并没有导致编译错误:

match number {
    i => println!("Zero"),
}

不同的是我去掉了防护,如果防护不应该被考虑进去,为什么会影响到事情呢?

pn9klfpd

pn9klfpd1#

你引用的文档并没有说没有考虑保护,而是说没有考虑保护 * 条件 *。这意味着即使number的所有可能值都被覆盖了,下面的代码也将无法编译:

match number {
    i if i >= 0 { 1 },
    i if i < 0  { 0 },
}

或者甚至是这样的:

match number {
    i if true => { 0 },
}

换句话说,在匹配臂上存在防护装置的事实将导致在检查匹配是否完成时完全忽略该臂。

相关问题