后卫如何影响比赛陈述?

Qro*_*aki 4 rust

我简化了学习 rust by example - Guards 中出现的一个示例: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"),
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的示例会导致有关匹配情况不全面的编译错误。我不知道为什么。文章说“请注意,编译器在检查匹配表达式是否涵盖所有模式时不会考虑保护条件。” 但下面的示例不会导致编译错误:

match number {
    i => println!("Zero"),
}
Run Code Online (Sandbox Code Playgroud)

不同的是我去掉了守卫。如果不应该考虑守卫,为什么会影响事情呢?

Jmb*_*Jmb 7

您引用的文档并没有说不考虑警卫,而是说不考虑警卫条件。这意味着即使number覆盖了所有可能的值,以下内容也将无法编译:

match number {
    i if i >= 0 { 1 },
    i if i < 0  { 0 },
}
Run Code Online (Sandbox Code Playgroud)

甚至这个:

match number {
    i if true => { 0 },
}
Run Code Online (Sandbox Code Playgroud)

换句话说,匹配臂上有一个守卫的事实将导致在检查匹配是否完成时该臂被完全忽略。

  • 换句话说,编译器假设任何匹配守卫都可能失败,否则您可以简单地忽略它们。这两个例子中的情况确实如此——在第一个例子中,你可以省略第二只手臂上的比赛守卫。 (2认同)