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)
编译器只是无法确认,您正在耗尽匹配模式,那是因为您在模式之外进行匹配:
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)