结果<bool, T> 模式匹配

Sve*_*rev 0 pattern-matching rust

我偶然发现了 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)
}
Run Code Online (Sandbox Code Playgroud)

除非我取消对最后一个匹配臂的注释,否则上面的代码段不会编译出现以下错误。但是布尔值只有 TRUE/FALSE,那么为什么 rustc 认为匹配并不详尽呢?

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)
}
Run Code Online (Sandbox Code Playgroud)

生锈:

error[E0004]: non-exhaustive patterns: `Ok(_)` not covered
 --> src/main.rs:4:10
  |
4 |    match bool_result(false) {
  |          ^^^^^^^^^^^^^^^^^^^^^^ pattern `Ok(_)` not covered
Run Code Online (Sandbox Code Playgroud)

chp*_*pio 5

编译器只是无法确认,您正在耗尽匹配模式,那是因为您在模式之外进行匹配:

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)
}
Run Code Online (Sandbox Code Playgroud)

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