结果<布尔,t =“”>模式匹配

时间:2019-04-11 10:28:57

标签: rust pattern-matching

我偶然发现了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)

1 个答案:

答案 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)
}

https://play.integer32.com/?version=stable&mode=debug&edition=2018&gist=1389a76ee657e11eb045a4ffc8da9800