我偶然发现了Rust编译器的一个非常奇怪的行为:
fn main() {
match bool_result(false) {
Err(_) => println!("Got error"),
Ok(value) if value => println!("Got value TRUE"),
Ok(value) if !value => println!("Got value FALSE"),
// Ok(z) => println!("WTF: {}", z), // uncomment to compile
}
}
fn bool_result(x: bool) -> Result<bool, ()> {
Ok(x)
}
除非我取消注释最后一个匹配臂,否则上面的代码段不会与以下错误一起编译。但是布尔值只有TRUE / FALSE,那么为什么rustc认为匹配并不详尽?
error[E0004]: non-exhaustive patterns: `Ok(_)` not covered
--> src/main.rs:4:10
|
4 | match bool_result(false) {
| ^^^^^^^^^^^^^^^^^^^^^^ pattern `Ok(_)` not covered
Rustc:
rustc --version
rustc 1.33.0 (2aa4c46cf 2019-02-28)
答案 0 :(得分:4)
编译器只是无法确认您是否用尽了匹配模式,这是因为您正在模式之外进行匹配:
fn main() {
match bool_result(false) {
Err(_) => println!("Got error"),
Ok(true) => println!("Got value TRUE"),
Ok(false) => println!("Got value FALSE"),
}
}
fn bool_result(x: bool) -> Result<bool, ()> {
Ok(x)
}