我简化了学习 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)
不同的是我去掉了守卫。如果不应该考虑守卫,为什么会影响事情呢?
您引用的文档并没有说不考虑警卫,而是说不考虑警卫条件。这意味着即使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)
换句话说,匹配臂上有一个守卫的事实将导致在检查匹配是否完成时该臂被完全忽略。
| 归档时间: |
|
| 查看次数: |
585 次 |
| 最近记录: |